我正在尝试查看如何从 lambda 代码中访问请求 header 和正文值。如果请求正文是 JSON 格式,它似乎会自动被解析并在事件对象中可用。
How can I access the complete query string, request body, request headers (cookies) for any type of incoming "Content-Type" request inside Lambda ?
下面的编辑是我收集的信息,以帮助解决可能相关或不相关的问题。如果您愿意,请忽略它们。
编辑:
我浏览了 SE here 上的现有问题和 here .
按此 thread , 使用
$input.json('$')
应该做的伎俩。我猜上面这些链接的答案已经过时了,因为默认情况下 API 网关似乎可以识别请求中的 JSON,如果是这样,则可以在 event
中使用它。没有配置任何映射模板的对象。按照建议设置映射对我不起作用。它不包含请求头信息。
以下是有关如何配置的屏幕截图。
“headers”键返回一个空值。使用
$input.params('$')
或 "$input.params('$')"
错误。编辑 2
尝试在方法请求中定义 header 。仍然没有在 lambda 中获取 User-Agent 值。
编辑 3
我在 API Gateway 上使用了以下模板映射
{
"request": $input.json('$'),
"headers": "$input.params()"
}
以及 lambda 中的以下代码
context.succeed("event.key32:"+JSON.stringify(event, null, 2) );
API 网关生成的响应显示了这一点
查看响应中的“headers”值,AWS-SDK/API 网关/cloudfront 似乎剥离了从 HTTP 客户端收到的所有 header ?这是 $input.params().header 返回的 JSON 的全文
header={CloudFront-Forwarded-Proto=https, CloudFront-Is-Desktop-Viewer=true, CloudFront-Is-Mobile-Viewer=false, CloudFront-Is-SmartTV-Viewer=false, CloudFront-Is-Tablet-Viewer=false, Content-Type=application/json, Via=1.1 5d53b9570d94ce920abbd471.cloudfront.net (CloudFront), 1.1 95eea7baa7ec95c9a41eca9e3ab7.cloudfront.net (CloudFront), X-Amz-Cf-Id=GBqmObLRy6Iem9bJbVPrrW1K3YoWRDyAaMpv-UkshfCsHAA==, X-Forwarded-For=172.35.96.199, 51.139.183.101, X-Forwarded-Port=443, X-Forwarded-Proto=https}}
它的 header 中没有 User-Agent 字符串,尽管如上面的屏幕截图所示,它是由 REST 客户端发送的。
有趣的是,整个查询字符串都可用。不确定这是否是访问它的预期方式。
最佳答案
可以使用 $input.params('header-name')
访问请求 header
令人惊讶的是,无法使用上述代码访问 User-Agent header 。您需要跳过the以下箍取回它:$context.identity.userAgent
应该可以使用以下代码访问请求正文/有效负载。更多引用here , here和 here :
{
"reqbody": "$input.path('$')"
}
目前尚不清楚请求正文是否应为 JSON。需要注意的是,请求根据this被当作UTF-8处理。邮政。
目前好像有两个 bugs :
{
"Type": "User",
"message": "Could not parse request body into json."
}
在 Amazon API 中失败的示例请求
我相信这需要更正才能实现缓存的 ETag 机制。
引用文献:
Etag 应该用双引号括起来。浏览器应通过 If-None-Match header 将此确切值发送回,而这正是 Amazon API 中断的地方。
Syntax for ETag?
HTTP: max length of etag
http://gsnedders.com/http-entity-tags-confusion
关于amazon-web-services - 使用 http 端点访问 lambda 中的 HTTP 请求( header 、查询字符串、cookie、正文)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31851860/