【问题标题】:Python can't read body in API Gateway request?Python 无法读取 API Gateway 请求中的正文?
【发布时间】:2022-01-13 14:14:10
【问题描述】:

我正在尝试编写一个 Lambda 函数,该函数通过命中 API 网关端点来调用。简单地返回事件,我可以看到响应中有一个body:

def lambda_handler(event, context):
    return str(event)

回复:

{
    'version': '2.0',
    'routeKey': 'ANY /identify',
    'rawPath': '/default/identify',
    'rawQueryString': '',
    'headers':
    {
       ...
    },
    'requestContext':
    {
       ...
    },
    'body': '<base64 encoded string is here>',
    'isBase64Encoded': True
}

但是,当我尝试返回 just 正文时,我会收到以下错误(包括多个示例,它们都返回相同的错误)。

def lambda_handler(event, context):
    return str(event['body'])
def lambda_handler(event, context):
    return json.loads(event['body'])
def lambda_handler(event, context):
    params = parse_qs(event["body"])
def lambda_handler(event, context):
    return event['body']
{
  "errorMessage": "'body'",
  "errorType": "KeyError",
  "requestId": "5acbcc66-da05-429f-baa9-6c8d83801b4f",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 10, in lambda_handler\n    return json.loads(event['body'])\n"
  ]
}

有什么想法吗?

【问题讨论】:

标签: python amazon-web-services api rest aws-lambda


【解决方案1】:

KeyError 表示您正在尝试访问 Python 字典中不存在的键。

根据documentation:“API Gateway 使用包含 HTTP 请求的 JSON 表示的事件调用您的函数。”

我认为,当您返回 str(event) 时,它只会返回 json 事件的字符串化版本。但是,当您尝试在处理程序中访问 event[body] 而不首先在 json 上运行 json.loads() 时,您会得到上面的 KeyError。我通常首先在所有处理程序中运行json.loads(),然后将其分配给data 对象(这是一个Python 字典),如下所示:

data = json.loads(event["body"])

然后我可以使用那个身体:

print("[DEBUG] event['body']: {}".format(data))

【讨论】:

    猜你喜欢
    • 2020-04-16
    • 2019-08-05
    • 2020-05-16
    • 2022-10-14
    • 2019-04-07
    • 2021-12-06
    • 1970-01-01
    • 2020-11-10
    • 2016-03-15
    相关资源
    最近更新 更多