从AWS API Gateway返回HTML

时间:2015-11-09 16:58:19

标签: amazon-web-services aws-lambda aws-api-gateway

我正在努力实现与this post相同的功能,但我不理解那里的回复,并且无权在评论中要求澄清。

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

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

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

答案(由@ARUNBALAN NV表示)&#34;只需将HTML标记存储在变量中并将其返回。&#34;,但我不确定这在Lambda函数的上下文中意味着什么。这是否意味着返回&#34; application / json&#34;使用名为&#34;变量HTML&#34;的元素进行响应像这样的东西?

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

我把它设置为&amp;在API网关中,我的集成响应现在使用Mapping来完全按照建议提取元素(对于200个应用程序/ json响应):

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

结果现在返回一个点。

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

我对此出错的任何见解都将不胜感激。谢谢你的阅读!

3 个答案:

答案 0 :(得分:39)

你非常接近。理解这一点的关键是要意识到你返回的任何Python对象都将被序列化为JSON。因此,如果返回一个字符串,它将被引用并转义为有效的JSON对象。如果需要此字符串的值,请使用以下Integration Response映射:

#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,那么使用这种方式的映射会更有用。我使用上面的第一个映射来解决您的问题。

答案 1 :(得分:3)

使用快递时,您只需在应用中设置标题,如:

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

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

答案 2 :(得分: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>"
}