【问题标题】:Request body serialization differences when lambda function invoked via API Gateway v Lambda Console通过 API Gateway v Lambda 控制台调用 lambda 函数时的请求正文序列化差异
【发布时间】:2017-11-13 10:33:01
【问题描述】:

我在 AWS API Gateway 中设置了一个简单的 API。它设置为通过 API Gateway 代理集成调用 Python 2.7 lambda 函数。

我遇到了一个奇怪的错误,即 lambda 在本地和通过 lambda 测试控制台调用时工作(正确处理主体并更新了数据库),但不是通过 curl 或 Postman。

事实证明,当通过 lambda 测试控制台调用时,event['body'] 对象作为 dict 传入。当通过 HTTP 客户端调用时,它以字符串 (Unicode) 的形式传入。

我当然可以解决它,但我想理解它,而且我也更喜欢一个合适的 Python 对象。我也希望能够使用 lambda 测试控制台,但目前我不能,因为它以不同的方式传递其输入。

我是否缺少一个配置开关,它将强制 API Gateway 将请求正文(以及所有其他参数)序列化为 python dict 或适当的对象? documentation 关于所传递内容的细节很少,说明:

event – AWS Lambda 使用此参数将事件数据传递给处理程序。该参数通常是 Python dict 类型。也可以是list、str、int、float或NoneType类型。

我知道这个简介涵盖了我所看到的,但它并不完全有帮助。

【问题讨论】:

  • 抱歉,API Gateway 只是直接调用 Lambda API。如果您手动调用您的函数(例如使用 CLI),您会看到类似的行为吗?
  • @BobKinney:我没有尝试过,只是通过他们的网络界面(lambda 控制台/测试)。老实说,在这一点上,我不确定这是否重要。我可以随时拨打json.loads(event['body']) 继续我的生活。我只是不明白其中的区别,或者为什么类型本质上是未指定的(而是六个不同的未指定选项之一。)

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


【解决方案1】:

当您在本地或通过 Lambda 控制台调用 lambda 时,您是在直接调用该 lambda,因此您的 lambda 会准确地接收您发送的内容。

当您通过 API Gateway 调用它时,API Gateway 会根据您的 HTTP 请求为您创建 event 对象。它添加了 HTTP 标头、路径、查询字符串、有效负载等。

以下是您从 API 网关调用中获得的 event 的摘要:

{
    "resource": "Resource path",
    "path": "Path parameter",
    "httpMethod": "Incoming request's method name"
    "headers": {Incoming request headers}
    "queryStringParameters": {query string parameters }
    "pathParameters":  {path parameters}
    "stageVariables": {Applicable stage variables}
    "requestContext": {Request context, including authorizer-returned key-value pairs}
    "body": "A JSON string of the request payload."
    "isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encode"
}

参考:http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-input-format

如您所见,body 将作为 string 发送给您,您可以使用 json.loads() 对其进行解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 2015-07-04
    • 2023-02-14
    • 2019-01-07
    相关资源
    最近更新 更多