【问题标题】:Failing requests.post when using json.dumps [duplicate]使用 json.dumps 时 requests.post 失败 [重复]
【发布时间】:2018-02-09 20:11:44
【问题描述】:

使用 Python 3.5 和 requests 2.18.4 我需要将数据发送到另一个服务,但由于某种原因它目前失败了。 在我从另一个服务接收和清理数据后进行发送,并最终验证数据并将其设置为本机 python dict。 当数据被硬编码并且我没有使用传入数据(硬编码的 json 字符串)时,此方法有效:

def my_post_method(self, url, data):
    # import requests (above)
    return requests.post(
        url,
        data='{"keyA":"valA", "keyB":"valB" ... }',
        headers={'Content-Type': 'application/json'},
    ) # status 200

但由于某种原因,我无法将其与原始数据一起发送。

def my_post_method(self, url, data):
    # import requests, json (above)
    d = json.dumps(data)
    return requests.post(
        url,
        data=d,
        headers={'Content-Type': 'application/json'},
    ) # status 400 

d 从上面:{"keyA":"valA", "keyB":"valB" ... }

我尝试使用 requests json 参数而不是数据,但其他服务显然期望另一端的数据参数。 这是否意味着我发布的服务正在等待 json 格式的字符串?

【问题讨论】:

  • 我们可以知道其他服务吗?我们可以尝试公开的东西吗?
  • 您是否尝试过再次使用硬编码字符串进行 POST?服务是否有可能返回 400 秒,因为它不希望您两次发出相同的请求?
  • 感谢@Rob Watts,但我在下面回答了-出于某种奇怪的原因,在接收端验证传入数据时考虑了键值的顺序。我真的不知道为什么......
  • @camelBack 我遇到了类似的问题,发现在有效负载上运行了两次转储。第二个转储转义了第一个转储 json 字符串中的所有双引号。

标签: python json python-requests


【解决方案1】:

如果您使用至少版本 2.4.2 的请求,我将在接受 Python 字典的 requests.post 中使用参数 json,完全避免使用 json.dumps

More complicated requests

编辑: 我无法以任何方式重现该问题,json 应该可以工作,这是在现代requests 中发送带有帖子的 json 的唯一正确方法。

【讨论】:

  • 我不能 - 当我这样做时它会失败(我在上面写过)我应该降级我的请求吗? (2.18.4->2.4.2)
  • 您是否在未指定内容类型的情况下尝试使用json
  • 是的,仍然失败
  • 您是否从您returnResponse 对象中获取使用status_code 的代码?您是否编写了其他服务?
  • @camelBack 键的顺序绝对不重要 - json.org 规范是“一组 无序 名称/值对”。
猜你喜欢
  • 2013-10-18
  • 2013-11-21
  • 2022-11-19
  • 2015-08-26
  • 1970-01-01
  • 2020-11-10
  • 2012-07-18
  • 2016-01-20
相关资源
最近更新 更多