requests中post中data=None, json=None两个参数区别
在 requests.post()
方法中,data
和 json
主要用于发送请求体,但它们的作用和格式有所不同。
1. data
参数
- 用途:用于发送表单数据或原始二进制数据。
- 格式:
- 可以是 字典(dict)(默认会编码为
application/x-www-form-urlencoded
)。 - 也可以是 字符串(str)、字节(bytes) 或 文件对象。
- 可以是 字典(dict)(默认会编码为
示例:以表单形式发送数据(默认 application/x-www-form-urlencoded
)
import requests
url = "https://example.com/api"
data = {"username": "admin", "password": "123456"}
response = requests.post(url, data=data)
print(response.request.headers["Content-Type"])
# 输出: application/x-www-form-urlencoded
示例:以字符串发送数据
response = requests.post(url, data="username=admin&password=123456")
print(response.request.headers["Content-Type"])
# 仍然是 application/x-www-form-urlencoded
示例:发送二进制数据
binary_data = b"\x89PNG\r\n\x1a\n..." # PNG 文件数据
response = requests.post(url, data=binary_data)
2. json
参数
- 用途:用于直接发送 JSON 格式的数据(
application/json
)。 - 格式:应为 JSON 可序列化的 Python 对象(
dict
、list
等)。 - 自动序列化:
requests
会自动将其转换为 JSON 字符串,并自动设置Content-Type: application/json
。
示例:发送 JSON 格式的数据
response = requests.post(url, json={"username": "admin", "password": "123456"})
print(response.request.headers["Content-Type"])
# 输出: application/json
3. data
vs json
区别总结
data | json | |
---|---|---|
传输格式 | application/x-www-form-urlencoded (默认)或 multipart/form-data (如文件上传) | application/json |
数据类型 | dict (默认转换为 key=value&key2=value2 )、字符串、字节 | dict (自动转换为 JSON 格式的字符串) |
是否自动 JSON 编码 | ❌ 不会 自动转换为 JSON,需要手动 json.dumps() | ✅ 自动 转换为 JSON |
4. 什么时候使用 data
vs json
?
✅ 使用 data
:
- 当 API 需要表单提交时(如
application/x-www-form-urlencoded
)。 - 上传二进制数据(如
bytes
、文件对象)。
✅ 使用 json
:
- 当 API 需要 JSON 格式的请求体时(如 REST API)。
- 与 Flask/Django/FastAPI 这种 JSON API 兼容的后端通信时。
示例:如果 API 只接受 JSON,错误用法
requests.post(url, data={"username": "admin", "password": "123456"}) # ❌ 可能会失败
正确做法:
requests.post(url, json={"username": "admin", "password": "123456"}) # ✅ 推荐使用 json
或者:
import json
requests.post(url, data=json.dumps({"username": "admin", "password": "123456"}), headers={"Content-Type": "application/json"}) # ✅ 手动转换
如果你使用 data
但 API 需要 application/json
,服务器可能会解析失败。所以 如果 API 需要 JSON,就直接用 json=
,避免手动 json.dumps()
和 Content-Type
设置。