通常,你想要發(fā)送一些編碼為表單形式的數(shù)據(jù)——非常像一個 HTML 表單。要實現(xiàn)這個,只需簡單地傳遞一個字典給 ?data
? 參數(shù)。你的數(shù)據(jù)字典在發(fā)出請求時會自動編碼為表單形式:
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print(r.text)
{
...
"form": {
"key2": "value2",
"key1": "value1"
},
...
}
你還可以為 ?data
? 參數(shù)傳入一個元組列表。在表單中多個元素使用同一 key 的時候,這種方式尤其有效:
>>> payload = (('key1', 'value1'), ('key1', 'value2'))
>>> r = requests.post('http://httpbin.org/post', data=payload)
>>> print(r.text)
{
...
"form": {
"key1": [
"value1",
"value2"
]
},
...
}
很多時候你想要發(fā)送的數(shù)據(jù)并非編碼為表單形式的。如果你傳遞一個 ?string
? 而不是一個 ?dict
?,那么數(shù)據(jù)會被直接發(fā)布出去。
例如,Github API v3 接受編碼為 JSON 的 POST/PATCH 數(shù)據(jù):
>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, data=json.dumps(payload))
此處除了可以自行對 ?dict
? 進行編碼,你還可以使用 ?json
? 參數(shù)直接傳遞,然后它就會被自動編碼。這是 2.4.2 版的新加功能:
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, json=payload)
Requests 使得上傳多部分編碼文件變得很簡單:
>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": "<censored...binary...data>"
},
...
}
你可以顯式地設(shè)置文件名,文件類型和請求頭:
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": "<censored...binary...data>"
},
...
}
如果你想,你也可以發(fā)送作為文件來接收的字符串:
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": "some,data,to,send\\nanother,row,to,send\\n"
},
...
}
如果你發(fā)送一個非常大的文件作為 ?multipart/form-data
? 請求,你可能希望將請求做成數(shù)據(jù)流。默認下 requests 不支持, 但有個第三方包 ?requests-toolbelt
? 是支持的。你可以閱讀 toolbelt 文檔 來了解使用方法。
在一個請求中發(fā)送多文件參考 高級用法 一節(jié)。
警告
我們強烈建議你用二進制模式(binary mode)打開文件。這是因為 Requests 可能會試圖為你提供 ?Content-Length header
?,在它這樣做的時候,這個值會被設(shè)為文件的字節(jié)數(shù)(bytes)。如果用文本模式(text mode)打開文件,就可能會發(fā)生錯誤。
更多建議: