【问题标题】:Return HTML from AWS API Gateway从 AWS API Gateway 返回 HTML
【发布时间】:2016-02-10 09:33:38
【问题描述】:

我正在尝试实现与this post 相同的目标,但我不明白那里的回复,也无权在 cmets 中要求澄清。

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

如前面的 SO 问题中所述,如果 Lambda 函数返回 HTML 字符串并且 API 端点使用默认的 Output Passthrough 行为@Integration 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 Gateway 中设置了它,我的集成响应现在使用映射来完全按照建议提取元素(用于 200 个应用程序/json 响应):

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

现在返回一个点。

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

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

【问题讨论】:

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


    【解决方案1】:

    你很亲密。理解这一点的关键是意识到您返回的任何 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 更有用。我会使用上面的第一个映射来解决您的问题。

    【讨论】:

    • 非常感谢,查尔斯!完美运行。
    • 这对我有用。作为参考,我使用“text/html”作为映射模板内容类型,最后一个 html 代码块效果很好。
    • 别忘了点击蓝色按钮并部署 API!!
    • 并且不要忘记在单击蓝色 Deploy 按钮和测试之间等待一小段时间,因为 AWS 端存在一些传播延迟。
    • “别忘了带毛巾!” 〜毛巾
    【解决方案2】:

    使用 express 时,您可以在应用程序中设置标题,如:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-04-19
        • 2019-08-24
        • 2017-09-27
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        • 2018-12-15
        • 2017-09-05
        • 2016-02-29
        相关资源
        最近更新 更多