【问题标题】:AWS Lambda send response to API GatewayAWS Lambda 向 API Gateway 发送响应
【发布时间】:2015-10-21 21:33:13
【问题描述】:

我有一个生成一些文本的 lambda 函数。这是一个简单的 Twilio 应用程序

<Say>Welcome to your conference room!</Say>
<Dial>
   <Conference beep="true">waitingRoom</Conference>
</Dial>

当我使用邮递员发出 POST 请求时,它会准确输出。但我有两个问题:

  1. 标题返回到 application/json,我需要它作为 text/xml。
  2. 当我从 Twilio 发出 POST 请求时,我得到 502 Bad Gateway

我知道它必须对传入的参数映射做一些事情,并将来自 Lambda 的响应作为 text/xml 映射回 API 网关。但我无法弄清楚如何做到这一点。

【问题讨论】:

  • 要设置标头,在 Templates 区域(对于 Lambda 函数)或 Mapping Templates 区域(对于 HTTP 代理或 AWS 服务代理),在 Content-Type 旁边,选择 Add(加号图标)。在 Content-Type 框中,键入将从方法传递到 Lambda 函数、HTTP 代理或 AWS 服务代理的数据的内容类型。然后选择更新(复选标记图标)。 docs.aws.amazon.com/apigateway/latest/developerguide/…
  • 这就是我所拥有的,那么我在哪里设置呢? screencast.com/t/tvm84Amd
  • 单击“方法响应”或“集成响应”。您可以在结果屏幕中修改响应标头。
  • 我做了,但我仍然得到这个 { "Type": "User", "message": "Could not parse request body into json." } 当我在正文中传递任何类型的参数时

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


【解决方案1】:

我使用以下模板映射基本上只是去掉引号,它起作用了:


$input.path('$')

【讨论】:

    【解决方案2】:

    我很高兴不是唯一一个与 AWS Api Gateway 苦苦挣扎的人 :)

    据我所知,AWS Api Gateway 主要面向 JSON。如果您可以更改返回的响应的内容(使用 JSON),也许您可​​以解决您的问题:

    {"say": "Welcome to your conference room!",
     "dial": [{
            "conference": [{
                    "beep": "true",
                    "name": "waitingRoom"
            }]
        }
    ]}
    

    然后您可以使用映射模板功能(在集成响应屏幕中)映射此内容,方法是添加一个内容类型设置为“application/json”的模板,一个映射模板设置为:

    <Say>$input.json('say')</Say>
    <Dial>
        <Conference beep="$input.json('dial.conference.beep')">$input.json('dial.conference.name')</Conference>
    </Dial>
    

    这对你有帮助还是我错过了什么?

    【讨论】:

    • 实际上我不喜欢这样做,因为这意味着我需要在 UI 中预定义所有可能的响应,而我几乎无法控制代码。所以我在映射上做了这个:#set($inputRoot = $input.path('$')) #foreach($elem in $inputRoot) $elem #end
    • 另外我觉得自己像个白痴,我没有部署我的 API,所以我所做的每一个更改都不起作用。所以是的,请确保在进行更改时进行部署大声笑
    【解决方案3】:

    要修改响应中的 Content-Type,您需要在 API Gateway 中配置 2 个区域:方法响应和集成响应。

    在方法响应中,为 200 状态代码添加 Content-Type 响应标头。

    在集成响应中,打开 200 响应并将 Content-Type 的值设置为 text/xml。

    这是我写的一篇关于返回 html 内容的文章中的几个屏幕截图。您的情况听起来非常相似,因为您希望返回恰好包含 xml 并发送正确的 Content-Type 标头的字符串类型。

    方法响应:

    集成响应:

    这里是原文链接:http://kennbrodhagen.net/2016/01/31/how-to-return-html-from-aws-api-gateway-lambda/

    【讨论】:

    • 知道如何为帖子执行此操作吗?
    • @RukshanDangalla 我希望同样的技术适用于 POST。您可能宁愿让 POST 返回一个 302 重定向到具有这种格式的 GET,这样用户就不会在点击返回按钮时让浏览器要求重新发布表单。
    • 我正在尝试使用 api 网关方式和 lambda 创建 facebook 画布应用程序。我成功创建了 http get 以返回 text/html。但问题是 Facebook 发送发布请求以将页面加载到 iframe 中。然后它显示以下消息 {"message": "Could not parse request body into json: Unrecognized token \'signed_request\': was expecting (\'true\', \'false\' or \'null\')\n在 [来源:[B@599d4f6;行:1,列:16]"}
    猜你喜欢
    • 2019-01-09
    • 2016-09-14
    • 2017-11-23
    • 2015-12-04
    • 2017-04-27
    • 2019-08-03
    • 2021-10-13
    • 2019-06-04
    • 2018-03-22
    相关资源
    最近更新 更多