python - 通过 API 网关 v Lambda 控制台调用 lambda 函数时请求主体序列化差异

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

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

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

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

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

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

event – AWS Lambda uses this parameter to pass in event data to the handler. This parameter is usually of the Python dict type. It can also be list, str, int, float, or NoneType type.

我知道这个简介涵盖了我所看到的内容,但这并不是很有帮助。

最佳答案

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

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

以下是您从 API 网关调用中作为 事件 获得的内容的摘要:

{
    "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() 对其进行解析。

关于python - 通过 API 网关 v Lambda 控制台调用 lambda 函数时请求主体序列化差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44491132/

相关文章:

amazon-web-services - 我正在运行一个 REST API 服务器,但我不太了解基础架构。另外,我可以做些什么来进行基准测试和提高速度?

asp.net-core - 我们可以在 template.serverless 文件中声明阶段名称吗?

python - 读取 DynamoDB 表的所有项目

python - 使用 django-adaptors 导入 csv 文件

amazon-ec2 - Amazon SNS 是否对 http 订阅使用 GET 或 POST?

java - AWS Lambda 和 API 网关以及 SOAP 客户端

javascript - String.replace() 不同编码的情况

python - settings.py 中模板文件夹的 Django 路径

python "TypeError: ' numpy.float6 4' object cannot be interpreted as an integer"

amazon-web-services - AWS-Cognito身份验证- curl 调用-在没有CLI的情况下生成 token -没有客户端 secret