我正在努力实现与这篇文章相同的目标,但我不理解那里的回复,也没有权限在评论中要求澄清。
我有一个API网关端点,它接受GET请求,通过一些请求变量传递给Lambda函数(在Python中实现),并通过空响应模型返回text/html(如本文所述
如前面的SO问题所述,如果Lambda函数返回HTML字符串,并且API端点使用默认的OutputPassthroughbehavior@IntegrationResponse,则引用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网关中,我的集成响应现在使用映射来提取元素(用于200个应用程序/json响应),正如所建议的那样:
#set($inputRoot = $input.path('$'))
$inputRoot.variableHTML .
现在的结果是返回一个点。
我尝试过很多变体($input.json而不是$input.path,不同阶段的不同内容类型,等等),但我觉得上面的设置与其他线程的公认答案最为匹配。
如果我有任何错误之处,我们将不胜感激。感谢阅读!
你非常接近。理解这一点的关键是要意识到,无论返回什么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更有用。我会用上面的第一个映射来解决你的问题。
使用express时,您只需在应用程序中设置标题,如:
res.set('Content-Type', 'text/html');
当使用aws-serverless-express
或类似内容时,应传播这些标头。
如果你使用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>"
}