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