Requests POST請求用法

2022-06-27 14:29 更新

通常,你想要發(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)

POST一個多部分編碼(Multipart-Encoded)的文件

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ā)生錯誤。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號