Return HTML 来自 AWS API 网关

Return HTML from AWS API Gateway

我正在尝试实现与 相同的目标,但我不理解那里的回复,也无权在评论中要求澄清。

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

所述

如前面的 SO 问题所述,如果 Lambda 函数 return 是一个 HTML 字符串并且 API 端点使用默认的输出直通行为 @ Integration Response,HTML 输出被引用:

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

那个答案(来自@ARUNBALAN NV)说 "Simply store the HTML markup in a variable and return it.",但我不确定这在 Lambda 函数的上下文中意味着什么。这是否意味着 return 带有名为 "variableHTML" 的元素的 "application/json" 响应?是这样的吗?

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

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

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

结果现在是 returned 的一个点。

我尝试了很多变体($input.json 而不是 $input.path,不同阶段的不同内容类型,等等),但感觉上面的设置与其他人接受的答案最接近线程。

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

你非常接近。理解这一点的关键是意识到无论你 return 的 Python 对象将被序列化为 JSON。因此,如果您 return 一个字符串,它将被引用并转义为有效的 JSON 对象。如果您想要此字符串的值,请使用以下集成响应映射:

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

#set 行给出 $inputRoot 整个 JSON 对象的值 Python 程序 returned... 这只是原始的您在 Lambda 框架将其转换为 JSON.

之前 return 编辑的字符串

假设您想在映射中而不是在您的程序中构建响应。然后,您可以 return 一个 Python 对象,而不是 returning 一个 Python 字符串,像这样:

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

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

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

如果您return使用结构化数据,那么以这种方式使用映射比简单的 HTML 更有用。我会使用上面的第一个映射来解决你的问题。

使用 express 时,您只需在应用中设置 header,例如:

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

当使用 aws-serverless-express 或类似的东西时,那些 header 应该被传播。

如果您使用的是 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>"
}