5.1 了解 HttpClient
在 Python 中,像許多程式語言一樣,有一個標準的 HttpClient。在 Python 中,它被稱為 http.client,可以執行低階的 HTTP 請求並處理 HTTP 回應。它允許建立到 HTTP 伺服器的連接並與其互動。
像 http.client 這樣的低階模組提供了對 HTTP 操作的更詳細控制,但需要更多的代碼來完成任務。相較之下,高階模組如 requests,提供了更簡單的介面,隱藏了許多實現細節。
http.client 的主要功能
http.client 模組 提供以下主要功能:
- 建立 HTTP 連接。
- 發送 HTTP 請求。
- 讀取 HTTP 回應。
- 處理請求和回應的標頭和本文。
相較於 requests 模組,http.client 模組更低階,並且對 HTTP 請求的運作細節給予了更多關注。
http.client 的主要類和方法
| 類/方法 | 描述 |
|---|---|
HTTPConnection |
建立 HTTP 連接。 |
HTTPSConnection |
建立 HTTPS 連接。 |
request(method, url, ...) |
發送 HTTP 請求。 |
getresponse() |
獲取請求的回應。 |
response.status |
回應的狀態碼。 |
response.reason |
狀態回應的文字描述。 |
response.read() |
讀取回應數據。 |
response.getheaders() |
獲取所有回應的標頭。 |
response.getheader(name) |
獲取特定標頭的值。 |
下面我們將更詳細地討論其中的一些。
5.2 執行 GET 請求
要使用 http.client 庫執行請求,需要按以下步驟操作:
建立連接
發送請求
獲取回應
關閉連接
重要的是,使用後要關閉連接以釋放資源並防止記憶體洩漏。這在處理大量請求或長期運行的應用程式中特別重要。
使用 HTTPConnection 的一般 HTTP 請求示例:
import http.client
# 建立 HTTP 連接
conn = http.client.HTTPConnection("example.com")
# 發送 GET 請求
conn.request("GET", "/")
# 獲取回應
response = conn.getresponse()
print(response.status, response.reason)
# 關閉連接
conn.close()
使用 HTTPSConnection 的示例:
import http.client
# 建立連接
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# 發送 GET 請求
conn.request("GET", "/posts/1")
# 獲取回應
response = conn.getresponse()
print(response.status, response.reason)
# 讀取並解碼回應數據
data = response.read().decode('utf-8')
print(data)
# 獲取所有回應的標頭
headers = response.getheaders()
for header in headers:
print(f"{header[0]}: {header[1]}")
# 關閉連接
conn.close()
看起來比使用 requests 稍微長一些,不是嗎?
5.3 執行 POST 請求
使用 http.client 執行 POST 請求 與 GET 請求 非常相似,只是需要自己將數據打包成 json 字串,並手動指定傳輸數據的類型——添加一個 Content-Type 標頭。
示例:
import http.client
import json
# 發送 POST 請求
conn.request("POST", "/posts", body=payload, headers=headers)
body 需要傳入序列化成字串的 json 對象,而 headers 為包含數據類型信息的字典。
就像這樣:
# 要發送的數據
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# 標頭 - 傳遞內容的類型
headers = {
'Content-Type': 'application/json'
}
那麼完整的 POST 請求 代碼將如下所示:
import http.client
import json
# 要發送的數據
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# 標頭
headers = {
'Content-Type': 'application/json'
}
# 建立連接
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# 發送 POST 請求
conn.request("POST", "/posts", body=payload, headers=headers)
# 獲取回應
response = conn.getresponse()
print(response.status, response.reason)
# 讀取並解碼回應數據
data = response.read().decode('utf-8')
print(data)
# 關閉連接
conn.close()
5.4 執行請求的錯誤處理
我也覺得提供一個錯誤處理的示例會很有幫助,因為它與 requests 的行為不同。在 http.client 模組中,如果連接有問題或有其他 HTTP 錯誤,則會 自動 引發異常。
示例:
import http.client
try:
# 建立連接
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# 發送 GET 請求
conn.request("GET", "/posts/1")
# 獲取回應
response = conn.getresponse()
print(response.status, response.reason)
# 讀取並解碼回應數據
data = response.read().decode('utf-8')
print(data)
except http.client.HTTPException as e:
print("HTTP 發生錯誤:", e)
except Exception as e:
print("發生錯誤:", e)
finally:
# 關閉連接
conn.close()
怎麼說呢?確實使用 requests 模組會更簡單。但!很多模組和框架底層使用的正是低階的 http.client。你需要知道怎麼和它一起工作,這樣你才能正確配置它們的運行。
GO TO FULL VERSION