首页 文章

从AWS API Gateway返回HTML

提问于
浏览
20

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

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

如前面的SO问题所述,如果Lambda函数返回HTML字符串,并且API endpoints 使用默认的输出直通行为@Intelliration 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网关中进行了设置,我的集成响应现在使用Mapping来完全按照建议提取元素(用于200个应用程序/ json响应):

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

结果现在返回一个点 .

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

任何有关我出错的见解将不胜感激 . 谢谢阅读!

2 回答

  • 3

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

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

    #set 行给出了Python程序返回的整个JSON对象的值 $inputRoot ...这是您在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,那么使用这种方式的映射会更有用 . 我会使用上面的第一个映射来解决您的问题 .

  • 39

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

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

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

相关问题