CodeGym /課程 /Python SELF TW /使用 HttpClient

使用 HttpClient

Python SELF TW
等級 23 , 課堂 4
開放

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。你需要知道怎麼和它一起工作,這樣你才能正確配置它們的運行。

2
任務
Python SELF TW, 等級 23, 課堂 4
上鎖
使用 http.client 執行 GET 請求
使用 http.client 執行 GET 請求
2
任務
Python SELF TW, 等級 23, 課堂 4
上鎖
使用 http.client 執行 POST 請求
使用 http.client 執行 POST 請求
1
問卷/小測驗
序列化,等級 23,課堂 4
未開放
序列化
序列化
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION