繁体   English   中英

从 2.7 升级到 3.6 时出现 python requests.post 错误

[英]python requests.post error when upgrade from 2.7 to 3.6

我有这个代码用于将帖子发送到 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 编译器开始给我这个错误:

类型错误:“字节”类型的对象不是 JSON 可序列化的

所以我必须将其更改为data=payload以使其通过 python 编译器,但随后它无法通过 api 网关并返回状态 415 的已知媒体错误。

所以有两个解决方案:

  1. 或者我如何找到一种在 python 3.6 中发送 JSON 字符串数据格式而不是 dict JSON 可序列化对象的方法。 我不能。

  2. 一些如何使 aws 服务能够接受由 python requests.post 发送的 dict JSON 可序列化对象的 api 网关。 这也做不到:(

任何帮助在这里。

我试过这个:

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

我在这里得到的评论非常有帮助。我首先使用str(sig, "utf-8")作为 sig 变量。 然后对于整个有效负载str(payload)然后在那之后我在从 python 2.7 迁移到 3.6 的代码中遇到了类似的错误,比如写入请求字节而不是 str 的文件,所以我不得不将 encode() 添加到一些字符串变量,如strBytes.encode()以便将其写入文件。 非常感谢代码在 python 3.6 中完全运行。

尝试这个:

payload = {"thing-name": thing_name, "thing-name-sig": sig}
r = requests.post(api_gw, json=payload)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM