amazon-web-services - 使用 http 端点访问 lambda 中的 HTTP 请求( header 、查询字符串、cookie、正文)对象

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

我正在尝试查看如何从 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 中使用它。没有配置任何映射模板的对象。

按照建议设置映射对我不起作用。它不包含请求头信息。

以下是有关如何配置的屏幕截图。

enter image description here

enter image description here

“headers”键返回一个空值。使用 $input.params('$')"$input.params('$')"错误。

编辑 2

尝试在方法请求中定义 header 。仍然没有在 lambda 中获取 User-Agent 值。

enter image description here

编辑 3

我在 API Gateway 上使用了以下模板映射
{
    "request": $input.json('$'),
    "headers": "$input.params()"
}

以及 lambda 中的以下代码
context.succeed("event.key32:"+JSON.stringify(event, null, 2) );

API 网关生成的响应显示了这一点
enter image description here

查看响应中的“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 , herehere :

{
   "reqbody": "$input.path('$')"
}

目前尚不清楚请求正文是否应为 JSON。需要注意的是,请求根据this被当作UTF-8处理。邮政。

目前好像有两个 bugs :
  • “User-Agent” header 丢失/被亚马逊 API 剥离。
  • 当 header 值包含双引号 (") 时,不会执行 lambda 函数。(我在 Cloudwatch 日志中没有看到此类请求的日志条目)。相反,http 响应正文包含下列的:
    {
       "Type": "User",
       "message": "Could not parse request body into json."
    }
    

  • 在 Amazon API 中失败的示例请求
    enter image description here

    我相信这需要更正才能实现缓存的 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/

    相关文章:

    python - 使用 boto 连接到 Amazon SQS

    javascript - 2018 年如何在 AWS Lambda 中访问 header

    amazon-s3 - 使用 AWS Lambda 在 S3 中连接文件

    Ruby Aws::Route53::没有标签的对象的客户端过滤器

    amazon-web-services - AWS Lambda : How to set up a NAT gateway for a lambda function with VPC access

    python - lambda 函数中的 python 和 python-jose 错误

    java - AWS SWF 在特定条件下重新启动工作流程

    javascript - 拒绝访问 : Not authorized to perform sts:AssumeRoleWithWebIdentity

    amazon-web-services - 将特定事件附加到 cloudwatch 事件规则

    javascript - 如何在 Typescript 中模拟 Cognito 响应