【问题标题】:python requests.post error when upgrade from 2.7 to 3.6从 2.7 升级到 3.6 时出现 python requests.post 错误
【发布时间】: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 的已知媒体错误。

所以有两种解决方案:

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

  2. 如何使 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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 也给出了这个错误:'TypeError: Object of type 'bytes' is not JSON serializable'
    • 已添加到问题中
    • 您可以分别使用thing_name.decode('utf-8')sig.decode('utf-8')thing-namething-name-sig 转换为字符串,然后重试。
    • 它说 str 没有 decode 属性但 encode 接受它。但它也说不可序列化
    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2018-06-27
    • 1970-01-01
    • 2016-11-22
    • 2023-02-08
    • 2019-11-27
    相关资源
    最近更新 更多