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

pyt*_*lus 6 python aws-lambda aws-api-gateway serverless-framework serverless

我试图找出如何使用无服务器框架直接以 JSON 形式返回响应。这是 AWS 上具有 Lambda 代理集成的功能。全部默认设置。目标是从 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"
            }
        }
Run Code Online (Sandbox Code Playgroud)

该函数如下所示:

    functions:
      report:
        handler: handler.handle
        events:
          - http:
              path: api/mypath
              method: post
              authorizer: aws_iam
Run Code Online (Sandbox Code Playgroud)

通过这些配置,我在 Postman 中得到的响应 BODY 是:

    {
        "statusCode": 200,
        "body": {
            "foo": "bar"
        },
        "headers": {
            "Content-Type": "application/json"
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以这很奇怪,为什么我把所有东西都当作身体?如何正确配置它以便我只获得“真实”主体?

rea*_*dul 6

方法#1

使用 json.dumps() 将 JSON 转换为字符串。

import json
def handle(event, context):
    log.info("Hello Wold")
    log.info(json.dumps(event, indent=2))
    return {
        "statusCode": 200,
        "body": json.dumps({"foo": "bar"}),
        "headers": {
            "Content-Type": "application/json"
        }
    }
Run Code Online (Sandbox Code Playgroud)

方法#2

使用 lambda 集成并避免使用 json.dumps()。但这会将你的输出转换为

{ foo = bar}
Run Code Online (Sandbox Code Playgroud)