使用 json.dumps 时 requests.post 失败 [重复]

Posted

技术标签:

【中文标题】使用 json.dumps 时 requests.post 失败 [重复]【英文标题】:Failing requests.post when using json.dumps [duplicate] 【发布时间】: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 字符串中的所有双引号。 【参考方案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 规范是“一组 无序 名称/值对”。

以上是关于使用 json.dumps 时 requests.post 失败 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

request

python requests请求返回结果中文乱码处理

python json requests request 模块

为啥在使用 json.dumps 时,python dict 的 int 键会变成字符串?

Requests方法 --- json模块

python request post请求body中有json数组