在使用 Python 發送 HTTP POST 請求時(無論是使用?requests
?還是?aiohttp
),json
?和?data
?參數有明確的區別和使用場景。理解這些區別對正確構建請求至關重要。
關鍵區別
特性 | json ?參數 | data ?參數 |
---|---|---|
內容類型 | 自動設置為?application/json | 需要手動設置(默認是?application/x-www-form-urlencoded ) |
數據處理 | 自動序列化 Python 對象為 JSON | 需要手動序列化 |
使用場景 | API 請求(JSON-RPC, RESTful API) | 表單提交、文件上傳、自定義格式 |
編碼 | UTF-8 | 取決于內容類型 |
易用性 | 更簡單(自動處理) | 需要更多手動工作 |
1. 何時使用?data
?
參數:?使用場景:
表單提交(HTML 表單數據):
python
form_data = {"username": "john", "password": "secret"} response = requests.post("https://example.com/login", data=form_data)
文件上傳:
python
files = {"file": open("report.pdf", "rb")} response = requests.post("https://example.com/upload", files=files)
發送原始文本(非 JSON):
python
xml_data = "<user><name>John</name></user>" response = requests.post("https://example.com/api", data=xml_data,headers={"Content-Type": "application/xml"})
多部分表單數據:
python
from aiohttp import FormDataform = FormData() form.add_field("username", "john") form.add_field("avatar", open("avatar.jpg", "rb"), filename="avatar.jpg",content_type="image/jpeg")async with session.post(url, data=form) as response:
自定義內容類型:
python
custom_data = "custom format data" response = requests.post("https://example.com/api", data=custom_data,headers={"Content-Type": "text/plain"})
2. 何時使用?json
?參數
使用場景:
當 API 期望接收 JSON 格式的數據時(大多數現代 API 使用 JSON)
當需要發送結構化數據(字典、列表等)
當 API 文檔指定請求體應為 JSON
示例:
python
import requestsdata = {"name": "John", "age": 30} response = requests.post("https://api.example.com/users", json=data)
在 aiohttp 中:
python
async with session.post(url, json=params) as response:
優點:
自動設置?
Content-Type: application/json
?頭自動將 Python 對象序列化為 JSON
簡化代碼
3. 最佳實踐建議
推薦使用?
json=params
:python
response = requests.post(url, headers=headers, json=params, timeout=60)
更簡潔
更安全(自動處理序列化)
自動設置正確的 Content-Type
如果使用?
data
,必須手動序列化:python
response = requests.post(url, headers=headers, data=json.dumps(params), timeout=60)
確保傳遞的是字符串,不是字典,??手動將`params`字典序列化為JSON字符串,然后通過`data`參數發送
確保設置了正確的 Content-Type
避免使用?
data=params
:這總是錯誤的,除非您確實想發送表單數據,?這會將`params`字典編碼為`application/x-www-form-urlencoded`格式(即表單數據),而不是JSON。
對于 JSON API,會導致服務器解析錯誤
?