开发者社区 问答 正文

无服务器框架Python lambda直接返回JSON

我试图找出如何直接使用无服务器框架将响应作为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"
        }
    }

所以这很奇怪,为什么我把一切都当成身体?如何正确配置它,以便仅获得“真实”主体?

展开
收起
祖安文状元 2020-02-24 09:56:29 832 分享 版权
阿里云 AI 助理回答

在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"}作为响应内容,而不会看到额外的statusCodeheaders信息。您也可以通过ECS一键诊断全面排查并修复ECS问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答