Python Requests包中data和json参数的区别

7dl7o3gd  于 2023-06-25  发布在  Python
关注(0)|答案(3)|浏览(122)

Python Requests包中的datajson参数有什么区别?
the documentation不清楚。
此代码是否:

import requests
import json
d = {'a': 1}
response = requests.post(url, data=json.dumps(d))

注意,我们在这里将dict转换为JSON️!
...做任何不同的事情:

import requests
import json
d = {'a': 1}
response = requests.post(url, json=d)

如果是的话,是什么?
后者是否自动将Content-Type HTTP头设置为application/json

cwdobuhd

cwdobuhd1#

为了回答我自己的问题,上面的两个例子似乎做了同样的事情,使用json参数确实会将header中的content-type设置为application/json。在上面使用data参数的第一个示例中,header中的content-type需要手动设置。

3duebb1j

3duebb1j2#

截至2021年12月,关于使用datajsonrequests文档现在非常清楚两者的区别。
(With我们对它的一点贡献-my PR和你的支持,证实了这曾经是一个问题。谢谢!)。

附言

这并没有回答OP问题,但如果第一段代码有点不同:

import requests
import json
d = {'a': 1}
response = requests.post(url, data=d)

(note这里的dictdNOT转换为JSON字符串!)
如果第二个代码是相同的(为了完整性,复制它):

import requests
import json
d = {'a': 1}
response = requests.post(url, json=d)

……那么结果就会大不相同。
第一个代码将生成一个内容类型设置为application/x-www-form-urlencoded的请求,数据格式如下:"a=1"
第二个代码将生成一个内容类型设置为application/json的请求,实际上数据也是这种格式,所以{"a": 1}-一个JSON字符串。

js4nwp54

js4nwp543#

仅从我这里的经验来看,但请注意,最好使用json字段与dict,而不是将dict转储到data字段中。
同样,仅凭经验,我没有研究代码本身,但似乎requests库做了一些比json.dumps更聪明的json序列化。当在data字段中使用json.dumps时,我遇到了几个示例,其中这导致来自(FastAPI)服务器的“value is not a valid dict”错误响应。使用json字段解决了这些问题。
编辑:我今天看了一下代码。如果使用json参数,似乎requests库实际上只设置Content-Type并转储它:

from .compat import json as complexjson
content_type = 'application/json'
body = complexjson.dumps(json)
if not isinstance(body, bytes):
    body = body.encode('utf-8')

requests.compat中,json只是:

try:
    import simplejson as json
except ImportError:
    import json

...因此,我真的不明白为什么手动使用data参数来做这件事有时会失败。¯_()_/¯

相关问题