所以我一直通过 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 本身,所以我不知道为什么它抱怨它不可序列化。
有什么办法可以解决这个问题吗?非常感谢!
在 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 内容时才有效.