AWS API Gateway 集成请求 Http 标头未传递给 lambda
Posted
技术标签:
【中文标题】AWS API Gateway 集成请求 Http 标头未传递给 lambda【英文标题】:AWS API Gateway integration request Http headers not being passed to lambda 【发布时间】:2020-01-22 13:50:38 【问题描述】:这与这篇帖子 API-Gateway Integration Request HTTP Header not mapping query string to header 类似,但我看不到任何答案,而且所有答案都与问题的意图无关。
我正在尝试在 API Gateway 中添加集成请求参数,但是每当我将 'Http Headers' as shown here 和 'Mapping template' 设置为直通时,当我在 lambda 中登录时,我看不到该标头。
此外,在集成响应中,我无法在集成标头响应参数中引用它。当我调用 API 时,“integration.response.header.cokers”将返回空白。 This is how I configured the integration response
【问题讨论】:
【参考方案1】:这里的最终解决方案是实现lambda proxy integration。
API Gateway 中的代理集成告诉 API Gateway 只需将所有标头转发到集成进行处理,这意味着您将在 lambda 函数中看到所有这些值。
注意:如果是代理集成,Lambda 必须将特定的响应格式返回给 API Gateway。最终,响应应该是这样的:
“状态代码”:200, “标题”: “回声代理”:真 , 'body': '一些有效载荷'您现在尝试做的是手动映射所有内容,这是一种已弃用的方法,通常您不想这样做,除非您绝对必须这样做,因为这有点痛苦。
如果您必须手动映射标头,请首先在方法请求中映射它们,以便它可以继续下一步,依此类推。基本上是这样的:
方法请求 -> 将变量映射到集成请求 -> 将变量映射到正文映射模板 -> 将变量映射到实际请求标头
集成请求的屏幕截图 -> HTTP 标头是:
名称:焦化器 映射自:'blah'
但是,“映射自”应该类似于“method.request.header.coker”,这是一个标准化路径(意味着从名为“coker”的方法请求标头字段中获取值)。
将 coker 标头添加到方法请求后,并且集成请求 HTTP 标头已正确映射,您必须实现映射模板。将 content-type 设置为 application/json 并设置 passthrough 为“当没有定义模板时(推荐)”和一个简单的映射模板:
“标题”: “焦化器”:“$input.params('coker')”这就是我的 API 的设置方式,它向我返回以下内容,因为我的 lambda 函数将事件作为 json 对象返回给 API GW:
"body": "\"headers\": \"coker\": \"mapped\"", "statusCode": 200注意:客户端请求中我的标头“coker”的值是“映射的”
更新答案 要将原始的“coker”标头映射到“coker2”(或您想给它的任何其他名称),您只需在映射模板中设置标头的名称,如下所示:
“标题”: "coker2" : "$input.params('coker')"然后编辑您的 lambda 函数以返回“coker2”标头,您应该会得到如下响应:
"body": "\"headers\": \"coker2\": \"mapped\"", "statusCode": 200【讨论】:
我正在使用非代理来自动生成文档和 json 架构。在这种情况下意味着 $input.params('coker') 仅来自请求标头 'coker' ?即使我没有设置“集成请求 HTTP 标头”,它仍然可用吗?我真正想要的是在“集成请求 HTTP 标头”中说我将 coker2 映射为“method.request.header.coker”,在“映射模板”中我将其映射为“$input.params('coker2')”。我认为它不会在 lambda 中可用。 @HansTjipto "$input.params" 指的是原始变量名。因此,您必须将标题映射为“coker2”,输入参数为“coker”。我很快就会对此进行测试并稍微改变我的答案。我很好奇您为什么要更改标题名称?如果是我,我会一直把它作为焦化器,因为如果您有任何问题并想要验证它等,以后更容易跟踪/诊断...... 哦,那太快了,我仍然有我在设置中测试过的原始 API,所以我只是在我的映射模板中更改了名称并部署它,它也可以工作!答案已更新 谢谢,最后我也是这样做的,所以这意味着我们不能从“集成请求 HTTP 标头”映射它,对吗?我觉得“Integration Request HTTP Headers”有点没用。实际上,我们对标头进行了一些更改,但我们并不想修改我们的 lambda,因为它被其他直接调用使用。 是的,我的猜测是它对你或我来说并不意味着“有用”,但这只是应用程序的设计方式,这些是获取 lambda 函数所需的步骤。我仍然很好奇,为什么在集成请求中专门映射它很重要?似乎无论哪种方式都可以实现最终目标,一旦它成为 lambda,您就可以准确地引用它?以上是关于AWS API Gateway 集成请求 Http 标头未传递给 lambda的主要内容,如果未能解决你的问题,请参考以下文章
使用 HTTP 代理访问 AWS API Gateway 中的标头?
AWS API Gateway - Lambda 代理(集成请求) - 内部服务器错误
通过 HTTP 集成从 AWS Api Gateway 中的 websocket 提取 websocket 连接 ID 和其他详细信息