我在 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"
}
如您所见,body
将作为 string
发送给您,您可以使用 json.loads()
对其进行解析。
关于python - 通过 API 网关 v Lambda 控制台调用 lambda 函数时请求主体序列化差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44491132/