使用 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
?
是的,仍然失败
您是否从您return
的Response
对象中获取使用status_code
的代码?您是否编写了其他服务?
@camelBack 键的顺序绝对不重要 - json.org 规范是“一组 无序 名称/值对”。以上是关于使用 json.dumps 时 requests.post 失败 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
python json requests request 模块