在 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
設置。