在 requests.post() 方法中,data 和 json 主要用于发送请求体,但它们的作用和格式有所不同。
1. data 参数
 
- 用途:用于发送表单数据或原始二进制数据。
 - 格式: 
- 可以是 字典(dict)(默认会编码为 
application/x-www-form-urlencoded)。 - 也可以是 字符串(str)、字节(bytes) 或 文件对象。
 
 - 可以是 字典(dict)(默认会编码为 
 
示例:以表单形式发送数据(默认 application/x-www-form-urlencoded)
import requestsurl = "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 设置。