Python Requests包中的data
和json
参数有什么区别?
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
?
3条答案
按热度按时间cwdobuhd1#
为了回答我自己的问题,上面的两个例子似乎做了同样的事情,使用
json
参数确实会将header中的content-type
设置为application/json
。在上面使用data
参数的第一个示例中,header中的content-type
需要手动设置。3duebb1j2#
截至2021年12月,关于使用
data
与json
的requests
文档现在非常清楚两者的区别。(With我们对它的一点贡献-my PR和你的支持,证实了这曾经是一个问题。谢谢!)。
附言
这并没有回答OP问题,但如果第一段代码有点不同:
(note这里的
dict
d
NOT转换为JSON字符串!)如果第二个代码是相同的(为了完整性,复制它):
……那么结果就会大不相同。
第一个代码将生成一个内容类型设置为
application/x-www-form-urlencoded
的请求,数据格式如下:"a=1"
第二个代码将生成一个内容类型设置为
application/json
的请求,实际上数据也是这种格式,所以{"a": 1}
-一个JSON字符串。js4nwp543#
仅从我这里的经验来看,但请注意,最好使用
json
字段与dict,而不是将dict转储到data
字段中。同样,仅凭经验,我没有研究代码本身,但似乎requests库做了一些比
json.dumps
更聪明的json序列化。当在data
字段中使用json.dumps
时,我遇到了几个示例,其中这导致来自(FastAPI)服务器的“value is not a valid dict”错误响应。使用json
字段解决了这些问题。编辑:我今天看了一下代码。如果使用
json
参数,似乎requests库实际上只设置Content-Type
并转储它:在
requests.compat
中,json
只是:...因此,我真的不明白为什么手动使用
data
参数来做这件事有时会失败。¯_()_/¯