我试图找出如何直接使用无服务器框架将响应作为JSON返回。这是具有Lambda代理集成的AWS上的功能。所有默认设置。目标是从python lambda函数中,HTTP响应客户端直接获取的是JSON对象,而不是JSON的字符串序列化。
python处理程序就像这个简单
def handle(event, context):
log.info("Hello Wold")
log.info(json.dumps(event, indent=2))
return {
"statusCode": 200,
"body": {"foo": "bar"},
"headers": {
"Content-Type": "application/json"
}
}
该函数如下所示:
functions:
report:
handler: handler.handle
events:
- http:
path: api/mypath
method: post
authorizer: aws_iam
通过这些配置,我在Postman中得到的响应BODY为:
{
"statusCode": 200,
"body": {
"foo": "bar"
},
"headers": {
"Content-Type": "application/json"
}
}
所以这很奇怪,为什么我把一切都当成身体?如何正确配置它,以便仅获得“真实”主体?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在AWS Lambda中使用无服务器框架(Serverless Framework)与Lambda代理集成时,确保响应格式正确以直接返回JSON对象给客户端是很关键的。你的Lambda函数看起来已经很接近正确的配置了,但还需要一点调整。
Lambda代理集成期望特定的响应格式,其中body
字段应该包含你想要作为HTTP响应主体直接发送给客户端的JSON字符串。这意味着你需要将Python字典转换为JSON字符串。当前你的代码直接返回了一个包含字典的字典,这导致整个结构被序列化并作为单一的JSON对象返回。
为了仅返回“真实”的主体部分作为JSON响应,你应该修改你的Lambda函数如下:
import json
def handle(event, context):
log.info("Hello World")
log.info(json.dumps(event, indent=2))
# 将字典主体转换为JSON字符串
body = json.dumps({"foo": "bar"})
return {
"statusCode": 200,
"body": body,
"headers": {
"Content-Type": "application/json"
}
}
这样,当你的API Gateway接收到Lambda的响应时,它会识别出body
字段是一个JSON字符串,并直接将其作为响应主体传递给客户端,而不是整个事件结构。Postman或其他HTTP客户端现在应该只看到{"foo": "bar"}
作为响应内容,而不会看到额外的statusCode
和headers
信息。您也可以通过ECS一键诊断全面排查并修复ECS问题。