Python 的 requests 函式庫是一個強大的 http 用戶端函式庫工具,可以簡化 API 通信,特別是對於發出 POST 請求。無論您是建立與遠端 API 互動的應用程式還是 Web 抓取,掌握帶有請求的 POST 方法都是高效 Web 開發的基礎技能。
本指南提供了使用 Python 請求發出 POST 請求的全面演練,這是將資料傳送到伺服器的關鍵方法。我們將介紹範例、常見挑戰和最佳實踐。
對於該程式庫的新手,您可以透過使用 pip install requests 來安裝它並按照本指南進行操作。
HTTP 是 Web 用戶端(如瀏覽器或應用程式)和伺服器之間通訊的支柱。該協定使用請求來交換數據,並且可以有多種方法類型:
在 Python 中使用 POST 請求對於將資料傳送到伺服器的互動至關重要,而此方法可能有很多用例 - 接下來讓我們來看看。
了解何時使用 POST 而不是其他 HTTP 方法是 Web 開發的關鍵。與將資料作為有限 URL 參數的一部分發送的 GET 不同,POST 透過請求正文發送資料。這允許容納更大的有效負載並隱藏資料以確保安全。這使得 POST 方法非常適合:
清楚地了解了什麼是 POST 請求後,現在讓我們探索如何使用 requests 庫在 Python 中發送它們,涵蓋 JSON、表單資料和文件上傳等基本格式。
requests.post() 函數是在 Python 中傳送 POST 請求的主要工具。它允許透過指定 URL、標頭和資料本身來進行可自訂和直接的資料發送。最常見的數據類型包括 JSON、表單數據或原始正文數據,所有這些都可以使用 python 請求 POST 方法輕鬆處理。例如:
發送 POST 請求的基本 python requests post 範例:
import requests response = requests.post('https://httpbin.dev/post', data={'key': 'value'}) # or start a persisten session: session = requests.Session() response = session.post('https://httpbin.dev/post', data={'key': 'value'}) # Check response content print(response.status_code) print(response.text)
使用 requests.Session() 允許您在多個請求中保留某些參數(例如 cookie 或標頭)。這在處理 POST 請求時至關重要,因為伺服器經常追蹤當前客戶端狀態,並且可能會返回不同的數據,甚至阻止缺少特定標頭或 cookie 的 POST 請求。
HTTP Content-Type 標頭在 POST 請求中至關重要,因為它指定發送資料的格式,這確保伺服器可以正確解釋請求。
有些伺服器支援多種 POST 內容類型,而其他伺服器則需要特定格式。以下是一些常見的 Content-Type 標頭及其用途:
要在 python 請求中設定 Content-Type 標頭,請使用 headers 參數:
import requests response = requests.post( 'https://httpbin.dev/post', headers={ "Content-Type": "application/json", }, data='{ "key": "value" }' )
考慮到這一點,接下來讓我們來看看 POST 請求中最常見的資料格式。
JSON(JavaScript 物件表示法)是 API 通訊的常用格式,因為它易於建構和解析。它在 JavaScript 中原生可用,在 Python 中它可以使用 json 模組輕鬆轉換為 Python 字典。
使用 requests 函式庫發送帶有 JSON 資料的 Python 請求 POST 非常簡單。在requests.post()中使用json參數,它會自動處理編碼並設定Content-Type header:
import requests response = requests.post('https://httpbin.dev/post', data={'key': 'value'}) # or start a persisten session: session = requests.Session() response = session.post('https://httpbin.dev/post', data={'key': 'value'}) # Check response content print(response.status_code) print(response.text)
JSON 是迄今為止最受歡迎的 POST 資料類型,經常在以下場景中遇到:
當使用者與網頁上的輸入欄位互動時使用表單數據,例如:
表單資料傳送帶有 Content-Type 標頭 application/x-www-form-urlencoded 的數據,並以鍵值格式對資料進行 URL 編碼。讓我們來看看一個如何使用 Python 請求 POST 表單資料的範例,以便更好地理解這種格式:
import requests response = requests.post( 'https://httpbin.dev/post', headers={ "Content-Type": "application/json", }, data='{ "key": "value" }' )
在上面的範例中,當我們使用 python 字典作為資料參數時,Content-Type 標頭會自動設定。否則,如果我們傳遞字串,我們需要手動設定 Content-Type 標頭。
要使用Python的requests函式庫傳送文件,可以使用files參數。此參數採用位元組資料並自動將 Content-Type 標頭設定為 multipart/form-data。這對於上傳圖像、文件或媒體內容非常有用。讓我們來看看如何使用 Python 請求 POST 上傳檔案的一些範例:
import requests data = {'username': 'ziad', 'password': '1234'} response = requests.post('https://httpbin.dev/api', json=data)
在上面我們看到,我們可以為請求提供檔案物件以將資料串流傳輸到伺服器,也可以直接提供位元組資料。
發出 POST 請求後,最好驗證回應中是否有錯誤或元註解。為此,請求的 Response 物件提供了 status_code、headers 和 json() 等屬性,幫助評估成功或診斷問題。
首先,檢查response.status_code以驗證是否已成功發出POST請求並回應200 OK。否則,請參閱下面這張方便的表格。
Status Code | Issue | Description | Solution |
---|---|---|---|
400 Bad Request | Incorrect data or syntax error | The server couldn't process the request due to data format issues. | Check the data format and headers (e.g., Content-Type) for correctness. |
401 Unauthorized | Missing or invalid authentication | The request lacks valid authentication credentials. | Include valid API keys or tokens in headers. |
403 Forbidden | Access denied | The server refuses to authorize the request. | Verify permissions and check the API documentation for access requirements. |
404 Not Found | Incorrect URL | The server cannot find the requested endpoint. | Double-check the endpoint URL for typos and ensure it’s valid. |
405 Method Not Allowed | Unsupported HTTP method | The endpoint does not support the HTTP method used. | Confirm the correct HTTP method is used by consulting the API documentation. |
500 Internal Server Error | Server-side error | A generic error indicating an internal server issue. | Retry the request; contact API support if the issue persists. |
503 Service Unavailable | Temporary overload/maintenance | The server is temporarily unavailable due to high traffic or maintenance. | Wait and retry later; consider implementing retry logic for critical applications. |
透過監控response.status_code並結合錯誤處理邏輯,您可以在發出POST請求時確保穩健、可靠的互動。
以下是如何處理回應狀態程式碼的範例:
import requests response = requests.post('https://httpbin.dev/post', data={'key': 'value'}) # or start a persisten session: session = requests.Session() response = session.post('https://httpbin.dev/post', data={'key': 'value'}) # Check response content print(response.status_code) print(response.text)
了解如何解釋這些回應有助於有效處理錯誤,確保流暢的使用者體驗以及 API 互動中的故障排除。
要最佳化資料傳輸頻寬,您可以 POST Gzip 或 Brotli 壓縮資料。這是 gzip 壓縮的範例:
import requests response = requests.post( 'https://httpbin.dev/post', headers={ "Content-Type": "application/json", }, data='{ "key": "value" }' )
對於 Brotli 壓縮,可以使用 brotli 套件:
import requests data = {'username': 'ziad', 'password': '1234'} response = requests.post('https://httpbin.dev/api', json=data)
使用壓縮可以減少有效負載大小顯著最佳化頻寬並提高請求速度。這尤其適用於像 JSON 這樣可以很好壓縮的格式。
POST 請求,尤其是涉及大型資料集或大量資料的請求,由於資料傳輸和伺服器端處理所需的時間可能會很慢。並發可以透過允許多個請求同時運行來減輕這些延遲,從而加快大量資料上傳或 API 互動等任務的速度。
不幸的是,Python 的 requests 函式庫不支援 asyncio 的非同步操作,限制了它有效處理許多並發 POST 請求的能力。
這就是 httpx 的用武之地,因為它提供了一個與 Python 的 asyncio 事件循環無縫整合的 AsyncClient。這意味著您可以同時發送大量請求而不會阻塞,使 httpx 成為需要真正非同步支援的高效能應用程式的強大選擇。
或者,您可以使用執行緒在 Python 請求中啟用並行請求。這是一個使用帶有請求的內建線程包的範例:
form_data = {'search': 'product 1 & 2', 'count': 10} response = requests.post( 'https://httpbin.dev/post', data=form_data, ) # this will automatically add the Content-Type header # and convert data from dictionary to URL encoded format print(response.request.body) 'search=product+1+%26+2&count=10' print(response.request.headers['Content-Type']) 'application/x-www-form-urlencoded' # alternatively if we POST data as string # we need to manually identify Content-Type response = requests.post( 'https://httpbin.dev/post', data='search=product+1+%26+2&count=10' headers={ "Content-Type": "application/x-www-form-urlencoded" } ) print(response.request.body) 'search=product+1+%26+2&count=10' print(response.request.headers['Content-Type']) 'application/x-www-form-urlencoded'
透過使用線程,可以並行啟動多個 POST 請求,從而允許每個線程處理單一請求。
您可以在我們的專題文章中了解有關並發與並行的更多資訊:
併發與並行
(https://scrapfly.io/blog/concurrency-vs-parallelism/)
HTTP 請求可能很困難,並且由於無頭瀏覽器要求或用戶端阻塞而很快變得複雜。為此,Scrapfly 可以幫助您!
ScrapFly 提供網頁抓取、螢幕截圖和提取 API,用於大規模資料收集。
為了總結本指南,以下是 python 請求 POST 的一些常見問題的解答。
使用 headers 參數將標頭作為字典傳遞。請注意,請求會自動產生一些標頭,例如 User-Agent、Content-Length 和 Content-Type,因此在覆蓋它們時要小心。
資料用於表單編碼(預設)或原始資料(當覆蓋 Content-Type 標頭時)。而json是專門針對JSON格式資料的,會自動將Content-Type設定為application/json。
不幸的是,requests 函式庫不支援非同步請求。然而,httpx 庫是一種提供非同步功能的替代方案,使其適合需要並發的應用程式。
在本文中,我們深入研究了 Python 中請求的 POST 方法並了解到:
有關 Python 請求和 POST 請求的內容還有很多需要了解,但是透過本指南,您就可以開始建立與 API 和伺服器有效互動的強大應用程式和 Web 抓取工具。
以上是Python請求POST方法指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!