python请求包中数据和json参数之间的差异

use*_*844 44 python json python-requests

python Requests包中的data和json参数有什么区别?

文档中不清楚

这段代码是:

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

做任何不同于:

import requests
import json
d = {'a': 1}
response = requests.post(url, json=d)
Run Code Online (Sandbox Code Playgroud)

如果是这样,什么?后者是否自动将content-type标题设置为application/json

use*_*844 40

为了回答我自己的问题,看来我上面的两个例子做了同样的事情,并且使用json参数确实将content-type标题设置为application/json.在我上面的第一个使用data参数的示例中,content-type需要手动设置标题中的内容.

  • 这确实是理智的行为,但正确记录它会很有帮助.数据为dict的`json = data`不一定是显而易见的.我的第一直觉是`json = json.dumps(data)`因为它感觉更准确.然后我在远程API的末尾得到了无关的错误,因为它收到了json中进一步编码的json字符串的结果(即双重转储).难以检测,因为它是一个简单的字符串,因此仍然是有效的json.为了增加混淆,当记录接收端获得的内容时,输出无论是字符串还是字典形式都无法区分. (7认同)
  • 这就像API应该表现的那样。您也可以在这里https://github.com/kennethreitz/requests/blob/master/requests/models.py#L422查找。 (2认同)
  • 同意,除非实际阅读代码,否则在任何地方都没有记录。 (2认同)

Gre*_*cki 31

2020年感觉requests 文档的区别比较清楚了,不过我还是创建了一个PR来更清楚


PS 这不回答 OP 问题,但如果第一个代码会有所不同:

import requests
import json
d = {'a': 1}
response = requests.post(url, data=d)
Run Code Online (Sandbox Code Playgroud)

-请注意,dict d不是转换成JSON字符串在这里!

如果第二个代码相同(复制它以保持完整性):

import requests
import json
d = {'a': 1}
response = requests.post(url, json=d)
Run Code Online (Sandbox Code Playgroud)

……那么结果就会大不相同。

第一个代码将生成一个内容类型设置为application/x-www-form-urlencoded并且数据采用这种格式的请求,因此:"a=1"

第二个代码将生成一个内容类型设置为application/json这种格式的数据的请求,因此{"a": 1}- 一个 JSON 字符串。