AWS Lambda python API 调用方法未返回 JSON - 不可序列化?
AWS Lambda python API call method not returning JSON - not serialisable?
我有一个 Lambda 函数,它是对 API 的基本 Python GET 调用。它在本地工作正常,但是当我上传到 Lambda(连同请求库)时,它不会 return 来自 API 调用的 JSON 响应。我只是想让它 return 整个 JSON 对象给调用者。我在这里做了一些根本性的错误吗 - 我偶然发现了几篇文章说不支持从 Lambda Python 函数 returning JSON 。
代码如下:
import requests
import json
url = "http://url/api/projects/"
headers = {
'content-type': "application/json",
'x-octopus-apikey': "redacted",
'cache-control': "no-cache"
}
def lambda_handler(event, context):
response = requests.request("GET", url, headers=headers)
return response
我的包包含请求库和 dist,以及 json 库(不过我认为它不需要这个)。错误消息 returned 是:
{
"stackTrace": [
[
"/usr/lib64/python2.7/json/__init__.py",
251,
"dumps",
"sort_keys=sort_keys, **kw).encode(obj)"
],
[
"/usr/lib64/python2.7/json/encoder.py",
207,
"encode",
"chunks = self.iterencode(o, _one_shot=True)"
],
[
"/usr/lib64/python2.7/json/encoder.py",
270,
"iterencode",
"return _iterencode(o, 0)"
],
[
"/var/runtime/awslambda/bootstrap.py",
41,
"decimal_serializer",
"raise TypeError(repr(o) + \" is not JSON serializable\")"
]
],
"errorType": "TypeError",
"errorMessage": "<Response [200]> is not JSON serializable"
}
我已经解决了这个问题 - 我的 Python 代码的问题是它试图 return 整个 响应,而不是简单的JSON 正文(我本地版本的代码打印 'response.text')。此外,我已确保响应采用 JSON 格式(而不是原始文本)。更新代码:
import requests
import json
url = "http://url/api/projects/"
headers = {
'content-type': "application/json",
'x-octopus-apikey': "redacted",
'cache-control': "no-cache"
}
def lambda_handler(event, context):
response = requests.request("GET", url, headers=headers)
try:
output = response.json()
except ValueError:
output = response.text
return output
我也遇到了同样的错误,有一段时间我可以通过更改 Lambda 中的响应代码来解决这个问题 python3.6:
更改:response['Body'].read()
到 response['Body'].read().decode()
这样你会得到一个 JSON 虽然在我的例子中我得到了 /
后来我删除了。
我有一个 Lambda 函数,它是对 API 的基本 Python GET 调用。它在本地工作正常,但是当我上传到 Lambda(连同请求库)时,它不会 return 来自 API 调用的 JSON 响应。我只是想让它 return 整个 JSON 对象给调用者。我在这里做了一些根本性的错误吗 - 我偶然发现了几篇文章说不支持从 Lambda Python 函数 returning JSON 。
代码如下:
import requests
import json
url = "http://url/api/projects/"
headers = {
'content-type': "application/json",
'x-octopus-apikey': "redacted",
'cache-control': "no-cache"
}
def lambda_handler(event, context):
response = requests.request("GET", url, headers=headers)
return response
我的包包含请求库和 dist,以及 json 库(不过我认为它不需要这个)。错误消息 returned 是:
{
"stackTrace": [
[
"/usr/lib64/python2.7/json/__init__.py",
251,
"dumps",
"sort_keys=sort_keys, **kw).encode(obj)"
],
[
"/usr/lib64/python2.7/json/encoder.py",
207,
"encode",
"chunks = self.iterencode(o, _one_shot=True)"
],
[
"/usr/lib64/python2.7/json/encoder.py",
270,
"iterencode",
"return _iterencode(o, 0)"
],
[
"/var/runtime/awslambda/bootstrap.py",
41,
"decimal_serializer",
"raise TypeError(repr(o) + \" is not JSON serializable\")"
]
],
"errorType": "TypeError",
"errorMessage": "<Response [200]> is not JSON serializable"
}
我已经解决了这个问题 - 我的 Python 代码的问题是它试图 return 整个 响应,而不是简单的JSON 正文(我本地版本的代码打印 'response.text')。此外,我已确保响应采用 JSON 格式(而不是原始文本)。更新代码:
import requests
import json
url = "http://url/api/projects/"
headers = {
'content-type': "application/json",
'x-octopus-apikey': "redacted",
'cache-control': "no-cache"
}
def lambda_handler(event, context):
response = requests.request("GET", url, headers=headers)
try:
output = response.json()
except ValueError:
output = response.text
return output
我也遇到了同样的错误,有一段时间我可以通过更改 Lambda 中的响应代码来解决这个问题 python3.6:
更改:response['Body'].read()
到 response['Body'].read().decode()
这样你会得到一个 JSON 虽然在我的例子中我得到了 /
后来我删除了。