从AWS API网关返回HTML



我正在努力实现与这篇文章相同的目标,但我不理解那里的回复,也没有权限在评论中要求澄清。

我有一个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>"
}

相关内容

  • 没有找到相关文章

最新更新