20

我正在尝试实现与这篇文章相同的目标,但我不明白那里的回复,也无权在评论中要求澄清。

我有一个接受 GET 请求的 API 网关端点,将一些请求变量传递给 Lambda 函数(在 Python 中实现),并通过空响应模型返回 text/html(如此处所述

如前面的 SO 问题中所述,如果 Lambda 函数返回 HTML 字符串并且 API 端点使用默认的 Output Passthrough 行为@Integration Response,则引用 HTML 输出:

"\n<html>\n<body>\n ... \n</body>\n</html>\n"

该答案(@ARUNBALAN NV)说“只需将 HTML 标记存储在一个变量中并返回它。”,但我不确定这在 Lambda 函数的上下文中意味着什么。这是否意味着返回带有名为“variableHTML”的元素的“application/json”响应?像这样的东西?

"{\"variableHTML\": \"\\n<html>\\n<body>\\n ... \\n</body>\\n</html>\\n\"}"

我在 API Gateway 中设置了它,我的集成响应现在使用映射来完全按照建议提取元素(对于 200 个应用程序/json 响应):

#set($inputRoot = $input.path('$')) 
$inputRoot.variableHTML .

结果现在是返回一个点。

我尝试了许多变体($input.json 而不是 $input.path,不同阶段的不同内容类型等),但感觉上述设置最接近来自另一个线程的接受答案。

任何我在这方面出错的见解将不胜感激。谢谢阅读!

4

3 回答 3

42

你很亲密。理解这一点的关键是意识到您返回的任何 Python 对象都将被序列化为 JSON。因此,如果您返回一个字符串,它将被引用并转义为一个有效的 JSON 对象。如果您想要此字符串的值,请使用以下集成响应映射:

#set($inputRoot = $input.path('$')) 
$inputRoot

#set行给出$inputRoot了您的 Python 程序返回的整个 JSON 对象的值……这只是您在 Lambda 框架将其转换为 JSON 之前返回的原始字符串。

假设您想在映射中而不是在您的程序中构建响应。然后,您可以返回 Python 对象,而不是返回 Python 字符串,如下所示:

return {"title": "Greeting", "message": "Hello"}

您的映射可以将其转换为 HTML,如下所示:

#set($inputRoot = $input.path('$')) 
<html><head><title>$inputRoot.title</title></head>
<body>$inputRoot.message</body></html>

但是,如果您要返回结构化数据而不是简单的 HTML,那么使用这种映射方式会更有用。我会使用上面的第一个映射来解决您的问题。

于 2015-11-09T17:38:24.290 回答
3

使用 express 时,您只需在应用程序中设置标题,如:

res.set('Content-Type', 'text/html');

使用aws-serverless-express或类似时,应传播这些标头。

于 2017-01-17T10:30:17.500 回答
0

如果您使用的是 Python,则可以使您的响应如下所示:

return {
    "statusCode": 200,
    "isBase64Encoded": False,
    "headers":{
        "Access-Control-Allow-Origin":"'*'",
        "Access-Control-Allow-Methods":"GET",
        "Content-Type": "text/html; charset=utf-8"
        },
    "body": "<h1>Hello, world!</h1>"
}
于 2021-05-08T17:33:03.077 回答