【发布时间】:2019-12-16 07:07:41
【问题描述】:
我有这段代码用于向 aws api 网关发送帖子
payload = {"thing-name": thing_name, "thing-name-sig": sig}
r = requests.post(api_gw, data=payload)
api 网关返回: 方法完成,状态为:415
用于未知媒体
当我将 python 从 2.7 升级到 3.6 时问题就开始了
代码是这样工作的:
payload = {"thing-name": thing_name, "thing-name-sig": sig}
r = requests.post(api_gw, data=json.dumps(payload))
它工作正常,但是一旦我升级到 3.6,python 编译器就开始给我这个错误:
TypeError: 'bytes' 类型的对象不是 JSON 可序列化的
所以我必须将其更改为 data=payload 以使其通过 python 编译器,但它无法通过 api 网关并返回状态为 415 的已知媒体错误。
所以有两种解决方案:
我如何找到一种在 python 3.6 中发送 JSON 字符串数据格式而不是 dict JSON 可序列化对象的方法。我做不到。
如何使 api 网关(AWS 服务能够接受由 python requests.post 发送的 dict JSON 可序列化对象)。这也做不到:(
这里有任何帮助。
我试过这个:
payload = {"thing-name": thing_name, "thing-name-sig": sig}
r = requests.post(api_gw, json=payload)
它返回了这个回溯:
Traceback (most recent call last):
File "emon-device.py", line 154, in <module>
r = requests.post(api_gw, json=payload)
File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/api.py", line 116, in post
return request('post', url, data=data, json=json, **kwargs)
File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/api.py", line 60, in request
return session.request(method=method, url=url, **kwargs)
File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/sessions.py", line 519, in request
prep = self.prepare_request(req)
File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/sessions.py", line 462, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/models.py", l ine 316, in prepare
self.prepare_body(data, files, json)
File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/models.py", l ine 466, in prepare_body
body = complexjson.dumps(json)
File "/usr/lib64/python3.6/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib64/python3.6/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib64/python3.6/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/usr/lib64/python3.6/json/encoder.py", line 180, in default
o.__class__.__name__)
TypeError: Object of type 'bytes' is not JSON serializable
【问题讨论】:
-
thing_name 和 sig 的类型是什么。可以请更新的类型。它应该是 json 可序列化的,如字符串或
-
它只是字符串
-
似乎在 python 3 中字符串 get 转换为字节,所以在将其传递到有效负载之前将其再次转换为字符串
标签: python amazon-web-services python-requests http-post python-3.6