(AWS Lambda)“errorMessage”:“无法封送响应:HTTPResponse 类型的对象不可 JSON 序列化”

问题描述 投票:0回答:1

所以我一直通过 POSTMAN 测试我的服务器 API,结果如下所示:

我使用 AWS Lambda 的目标是(在日志中)显示从此 API 获得的任何 json 响应。我在 lambda 中的代码如下所示:

import json
import urllib3


def lambda_handler(event, context):
    http = urllib3.PoolManager()

    response = http.request('GET',
                        "http://106.10.54.227:9062/api/v1/weather-api",
                        retries = False)
    
    return response

但是,当我测试这个 lambda 函数时,我收到此错误:

Response:
{
  "errorMessage": "Unable to marshal response: Object of type HTTPResponse is not JSON serializable",
  "errorType": "Runtime.MarshalError"
}

我不明白的是,API 的响应是 JSON 本身,所以我不知道为什么它抱怨它不可序列化。

有什么办法可以解决这个问题吗?非常感谢!

python json amazon-web-services aws-lambda
1个回答
0
投票

在 Lambda 函数中,特别是对于 Python,函数处理程序返回的任何内容都将被转换/解码/序列化为 JSON。此序列化只能处理与 JSON 中直接一对一支持的类型的简单转换,这些类型是字典、列表、字符串、整数、浮点数、布尔值和无。

返回

http.request 响应,其具有 HTTPResponse 类型,这是一种复杂类型,通常不支持 JSON 序列化。

通常您想要的是http响应的主体/有效负载,在这种情况下您可以通过

response.read().decode('utf-8')
获取它。
.decode('utf-8')
很重要,因为
response.read()
返回一个
bytes
类型,该类型可能不可序列化,因此必须将其解码为
utf-8
,然后
.decode('utf-8')
将其转换为字符串,该字符串现在是可序列化的 JSON类型。

由于我们正在讨论传递 http 响应,因此人们可能会对

response.json()
感兴趣,它还会解析响应并将该字符串转换为解码后的类型,当然,仅当响应是有效的 JSON 内容时才有效.

© www.soinside.com 2019 - 2024. All rights reserved.