Python請求POST方法指南

Barbara Streisand
發布: 2024-11-24 04:33:11
原創
330 人瀏覽過

Guide to Python requests POST method

Python 的 requests 函式庫是一個強大的 http 用戶端函式庫工具,可以簡化 API 通信,特別是對於發出 POST 請求。無論您是建立與遠端 API 互動的應用程式還是 Web 抓取,掌握帶有請求的 POST 方法都是高效 Web 開發的基礎技能。

本指南提供了使用 Python 請求發出 POST 請求的全面演練,這是將資料傳送到伺服器的關鍵方法。我們將介紹範例、常見挑戰和最佳實踐。

對於該程式庫的新手,您可以透過使用 pip install requests 來安裝它並按照本指南進行操作。

什麼是 HTTP POST 請求?

HTTP 是 Web 用戶端(如瀏覽器或應用程式)和伺服器之間通訊的支柱。該協定使用請求來交換數據,並且可以有多種方法類型:

  • GET :從伺服器檢索資料而不更改它。
  • POST :將資料傳送到伺服器,非常適合:
    • 建立新記錄(例如使用者帳戶)。
    • 提交表單或使用者輸入。
    • 傳輸檔案或敏感資料。
  • PUT :更新現有資源,例如修改使用者設定檔。
  • DELETE :從伺服器中刪除指定的資源。
  • PATCH :部分更新現有資源。
  • HEAD :僅請求回應的標頭(元資訊),而不請求正文。
  • OPTIONS :檢查伺服器支援哪些 HTTP 方法。

在 Python 中使用 POST 請求對於將資料傳送到伺服器的互動至關重要,而此方法可能有很多用例 - 接下來讓我們來看看。

為什麼要使用POST方式提交資料?

了解何時使用 POST 而不是其他 HTTP 方法是 Web 開發的關鍵。與將資料作為有限 URL 參數的一部分發送的 GET 不同,POST 透過請求正文發送資料。這允許容納更大的有效負載並隱藏資料以確保安全。這使得 POST 方法非常適合:

  • 建立新記錄:新增使用者、發表評論或上傳文件。
  • 提交表單資料:當使用者透過聯絡表單、搜尋表單或帳戶設定提交資訊。
  • 傳輸敏感資料:與 GET 不同,POST 要求不會在 URL 中顯示參數,為敏感資訊提供額外的安全層。

清楚地了解了什麼是 POST 請求後,現在讓我們探索如何使用 requests 庫在 Python 中發送它們,涵蓋 JSON、表單資料和文件上傳等基本格式。

使用Python請求發送POST請求

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 標頭及其用途:

  • application/json 表示 API 通訊中常用的 JSON 格式。
  • application/x-www-form-urlencoded 用於 HTML 表單提交,將資料編碼為 URL 編碼的鍵值對。
  • multipart/form-data 專為文件上傳而設計,支援單一請求中的混合內容,例如二進位檔案和文字。

要在 python 請求中設定 Content-Type 標頭,請使用 headers 參數:

import requests
response = requests.post(
    'https://httpbin.dev/post', 
    headers={
        "Content-Type": "application/json",
    },
    data='{ "key": "value" }'
)

登入後複製
登入後複製
登入後複製

考慮到這一點,接下來讓我們來看看 POST 請求中最常見的資料格式。

如何發布 JSON 數據

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 資料類型,經常在以下場景中遇到:

  • 使用者驗證:登入或註冊時,JSON 用於傳送憑證並接收身分驗證令牌。
  • 資料檢索和提交:用於獲取或更新資料(例如天氣、股票價格或使用者個人資料)的 API,通常使用 JSON 進行回應,並且通常需要 JSON 來發送更新。
  • 配置設定:許多應用程式使用 JSON 發送或接收配置詳細信息,允許根據用戶偏好或系統要求進行靈活設定。
  • Web 應用程式中的表單提交:JSON 在提交表單或使用者輸入的應用程式中也很常見,例如調查或電子商務交易。

如何發布表單數據

當使用者與網頁上的輸入欄位互動時使用表單數據,例如:

  • 正在執行登入
  • 提交搜尋
  • 提交使用者產生的內容,例如評論或貼文

表單資料傳送帶有 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)

登入後複製
登入後複製

在上面我們看到,我們可以為請求提供檔案物件以將資料串流傳輸到伺服器,也可以直接提供位元組資料。

在 Python 中處理 POST 回應

發出 POST 請求後,最好驗證回應中是否有錯誤或元註解。為此,請求的 Response 物件提供了 status_code、headers 和 json() 等屬性,幫助評估成功或診斷問題。

首先,檢查response.status_code以驗證是否已成功發出POST請求並回應200 OK。否則,請參閱下面這張方便的表格。

常見的 POST 回應問題及其解決方法

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 請求提高效能

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/)

使用 Scrapfly 啟動

HTTP 請求可能很困難,並且由於無頭瀏覽器要求或用戶端阻塞而很快變得複雜。為此,Scrapfly 可以幫助您!

Guide to Python requests POST method

ScrapFly 提供網頁抓取、螢幕截圖和提取 API,用於大規模資料收集。

  • 反機器人保護繞過 - 抓取網頁而不阻塞!
  • 輪換住宅代理 - 防止 IP 位址和地理封鎖。
  • JavaScript 渲染 - 透過雲端瀏覽器抓取動態網頁。
  • 完全瀏覽器自動化 - 控制瀏覽器捲動、輸入和點擊物件。
  • 格式轉換 - 抓取為 HTML、JSON、文字或 Markdown。
  • Python 和 Typescript SDK,以及 Scrapy 和無程式碼工具整合。

常問問題

為了總結本指南,以下是 python 請求 POST 的一些常見問題的解答。

如何在使用 Python 請求時包含自訂標頭?

使用 headers 參數將標頭作為字典傳遞。請注意,請求會自動產生一些標頭,例如 User-Agent、Content-Length 和 Content-Type,因此在覆蓋它們時要小心。

Python請求中的data和json參數有什麼差別?

資料用於表單編碼(預設)或原始資料(當覆蓋 Content-Type 標頭時)。而json是專門針對JSON格式資料的,會自動將Content-Type設定為application/json。

Python requests 函式庫是否支援非同步 POST 請求?

不幸的是,requests 函式庫不支援非同步請求。然而,httpx 庫是一種提供非同步功能的替代方案,使其適合需要並發的應用程式。

概括

在本文中,我們深入研究了 Python 中請求的 POST 方法並了解到:

  • 如何使用 POST 請求將資料傳送到各種類型的伺服器,例如 JSON、表單資料和檔案上傳。
  • 如何處理 POST 請求回應和常見狀態代碼以及如何修復它們。
  • 如何使用 httpx 或並行請求執行緒來提高並發 POST 請求的效能。
  • 如何使用 gzip 和 brotli 模組壓縮資料以優化頻寬和速度。

有關 Python 請求和 POST 請求的內容還有很多需要了解,但是透過本指南,您就可以開始建立與 API 和伺服器有效互動的強大應用程式和 Web 抓取工具。

以上是Python請求POST方法指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板