http.client 教程-如何使用 Python 標準庫發送 HTTP 請求

http.client 教程-如何使用 Python 標準庫發送 HTTP 請求

以下是 http.client?模塊的詳細使用教程,幫助你理解如何使用 Python 標準庫發送 HTTP 請求:

1. http.client 概述

http.client?是 Python 內置的 HTTP 客戶端庫,提供了底層的 HTTP 協議實現,支持:

  • 發送 HTTP/1.1 請求
  • 處理響應狀態碼、頭信息和內容
  • 支持 HTTPS(通過 HTTPSConnection
  • 支持基本認證、Cookie 等功能

優點無需額外安裝依賴,適合輕量級 HTTP 交互

缺點:API 較為底層,使用復雜度高于 requests?庫。

2. 基本使用流程

步驟 1:導入模塊并創建連接

import http.client

# HTTP 連接

conn = http.client.HTTPConnection("example.com")

# HTTPS 連接(默認端口 443)

conn = http.client.HTTPSConnection("api.example.com")

# 指定端口(如 8080)

conn = http.client.HTTPConnection("localhost", 8080)

步驟 2:發送請求

# 發送 GET 請求

conn.request("GET", "/path/to/resource")

# 發送帶參數的 GET 請求

conn.request("GET", "/search?q=python&page=1")

# 發送 POST 請求(帶 JSON 數據)

headers = {"Content-Type": "application/json"}

body = '{"name": "test", "age": 30}'

conn.request("POST", "/users", body, headers)

步驟 3:獲取響應

response = conn.getresponse()

# 獲取響應狀態碼

status_code = response.status ?# 如 200, 404, 500

# 獲取響應頭

headers = response.getheaders()

# 獲取響應內容

data = response.read() ?# 返回 bytes 類型

text = data.decode("utf-8") ?# 轉為字符串

步驟 4:關閉連接

conn.close()

3. 處理不同類型的請求

GET 請求示例

import http.client

conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")

conn.request("GET", "/posts/1")

response = conn.getresponse()

print(f"狀態碼: {response.status}")

print(f"響應頭: {response.getheaders()}")

print(f"響應內容: {response.read().decode()}")

conn.close()

POST 請求示例(JSON 數據)

import http.client

import json

conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")

headers = {"Content-Type": "application/json"}

body = json.dumps({"title": "foo", "body": "bar", "userId": 1})

conn.request("POST", "/posts", body, headers)

response = conn.getresponse()

print(response.read().decode())

conn.close()

帶參數的 POST 請求(表單數據)

import http.client

from urllib.parse import urlencode

conn = http.client.HTTPConnection("example.com")

headers = {"Content-Type": "application/x-www-form-urlencoded"}

params = urlencode({"username": "test", "password": "123456"})

conn.request("POST", "/login", params, headers)

response = conn.getresponse()

print(response.read().decode())

conn.close()

4. 處理響應

響應狀態碼

if response.status == 200:

????print("請求成功")

elif response.status == 404:

????print("資源不存在")

else:

????print(f"錯誤: {response.status}")

響應頭處理

# 獲取特定頭信息

content_type = response.getheader("Content-Type")

print(f"內容類型: {content_type}")

# 獲取所有頭信息

headers = response.getheaders()

for header, value in headers:

????print(f"{header}: {value}")

響應內容處理

# 讀取二進制內容

data = response.read()

# 根據 Content-Type 解碼

content_type = response.getheader("Content-Type")

if "json" in content_type:

????import json

????json_data = json.loads(data)

elif "text" in content_type:

????text = data.decode("utf-8")

else:

????# 二進制數據(如圖像、文件)

????with open("file.bin", "wb") as f:

????????f.write(data)

5. 高級用法

設置超時時間

conn = http.client.HTTPSConnection("example.com", timeout=5) ?# 5秒超時

處理重定向(301/302)

max_redirects = 3

current_url = "/initial-path"

redirect_count = 0

while redirect_count < max_redirects:

????conn.request("GET", current_url)

????response = conn.getresponse()

????

????if response.status in (301, 302):

????????location = response.getheader("Location")

????????current_url = location

????????redirect_count += 1

????else:

????????break ?# 非重定向狀態碼,退出循環

設置請求頭(如 User-Agent)

headers = {

????"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",

????"Accept": "application/json"

}

conn.request("GET", "/api/data", headers=headers)

基本認證

import base64

username = "admin"

password = "secret"

auth_string = f"{username}:{password}"

auth_bytes = base64.b64encode(auth_string.encode())

auth_header = f"Basic {auth_bytes.decode()}"

headers = {"Authorization": auth_header}

conn.request("GET", "/protected", headers=headers)

6. 異常處理

import http.client

try:

????conn = http.client.HTTPSConnection("nonexistent-domain.com")

????conn.request("GET", "/")

????response = conn.getresponse()

except ConnectionRefusedError:

????print("連接被拒絕")

except TimeoutError:

????print("連接超時")

except http.client.InvalidURL:

????print("無效的 URL")

except Exception as e:

????print(f"發生錯誤: {e}")

finally:

????if conn:

????????conn.close()

7. 完整示例:獲取天氣 API 數據

import http.client

import json

try:

????# 連接到天氣API

????conn = http.client.HTTPSConnection("api.openweathermap.org")

????# API參數(城市ID和API密鑰)

????city_id = "1850147" ?# 東京的城市ID

????api_key = "YOUR_API_KEY" ?# 替換為你的API密鑰

????# 發送請求

????conn.request("GET", f"/data/2.5/weather?id={city_id}&appid={api_key}")

????# 獲取響應

????response = conn.getresponse()

????if response.status == 200:

????????data = json.loads(response.read().decode())

????????print(f"城市: {data['name']}")

????????print(f"天氣: {data['weather'][0]['description']}")

????????print(f"溫度: {data['main']['temp'] - 273.15:.1f}°C") ?# 轉為攝氏度

????else:

????????print(f"錯誤: {response.status} - {response.read().decode()}")

except Exception as e:

????print(f"發生異常: {e}")

finally:

????conn.close()

8. 與 requests 庫對比

特性

http.client

requests

所屬庫

Python 標準庫(無需安裝)

第三方庫(需 pip install

API 復雜度

底層,需要手動處理很多細節

高層,簡潔易用

請求方法

request()?結合方法參數

get(), post(), put()?等

響應處理

手動解析狀態碼、頭和內容

自動解析,提供 json()?方法

會話管理

需手動管理連接

自動管理會話(如 Cookie)

重定向處理

需手動實現

自動處理(可配置)

文件上傳

復雜

簡單(files?參數)

9. 常見問題解答

  • Q1:如何設置請求超時?

A:在創建連接時指定 timeout?參數,如 HTTPSConnection("example.com", timeout=10)

  • Q2:如何處理 HTTPS 證書驗證?

A:默認驗證證書。若需忽略,使用 context?參數:

import ssl

context = ssl._create_unverified_context()

conn = http.client.HTTPSConnection("example.com", context=context)

  • Q3:如何發送大文件?

A:使用分塊傳輸(Chunked Transfer),需設置 Transfer-Encoding: chunked?頭,手動分塊發送。

通過這個教程,你應該能夠掌握 http.client?的基本使用方法。在實際項目中,若追求更高的開發效率,推薦使用 requests?庫;若需要底層控制或環境受限(如無第三方庫),則 http.client?是更好的選擇。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90989.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90989.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90989.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android-三種持久化方式詳解

持久化技術分為3種&#xff0c;文件&#xff0c;sharedPreferences存儲&#xff0c;數據庫來存儲&#xff1b; 目錄 文件存儲&#xff1a; 利用SharedPreferences中讀取數據 SQLite創建數據庫 更新 添加 刪除 查找&#xff1a; 文件存儲&#xff1a; 文件存儲是 Andr…

并發安全之鎖機制一

鎖機制一 鎖機制是計算機系統中解決并發沖突的核心工具&#xff0c;其存在和應用場景源于一個根本問題&#xff1a;當多個執行單元&#xff08;線程、進程、分布式節點&#xff09;同時訪問或修改同一份共享資源時&#xff0c;如何保證數據的正確性、一致性和系統可靠性&#x…

結合項目闡述 設計模式:單例、工廠、觀察者、代理

原文鏈接&#xff1a;https://download.csdn.net/blog/column/12433305/133862792#_1613 1、工廠模式應用 C17及之后可編譯 /*日志落地模塊的實現1.抽象落地基類2.派生子類&#xff08;根據不同落地方向進行派生&#xff09;3.使用工廠模式進行創建與表示的分離 */#ifndef _…

uniapp 更新apk有緩存點不動,卸載安裝apk沒有問題。android

方式一。pages.json&#xff1a;"globalStyle" : {"navigationBarTextStyle" : "black","navigationBarTitleText" : "uni-app","navigationBarBackgroundColor" : "#F8F8F8","backgroundColor&qu…

HTML響應式SEO公司網站源碼

核心優勢 100%純HTML/CSS開發自動適配手機/平板/PC內置SEO優化結構0.5秒極速加載 包含頁面 ? 首頁&#xff08;關鍵詞布局優化版&#xff09; ? 服務項目展示頁 ? 客戶案例庫 ? 新聞資訊系統 ? 聯系方式&#xff08;帶地圖API&#xff09; 技術參數 兼容Chrome/Firefo…

Error: llama runner process has terminated: exit status 2

我是i7 12700h ,3080顯卡&#xff0c;在 Windows 11 上運行 ollama run deepseek-r1:1.5b 出現 Error: llama runner process has terminated: exit status 2 之前是好用的&#xff0c;后來不知為什么就不好用了。 原因&#xff1a; 檢查 Microsoft Visual C Redistributab…

Linux中ssh遠程登錄原理與配置

SSH連接的五個階段 1. 版本協商階段&#xff08;Protocol Version Negotiation&#xff09;目的&#xff1a;協商使用SSH-1或SSH-2協議&#xff08;現代系統默認SSH-2&#xff09;。流程&#xff1a;關鍵點&#xff1a;若版本不兼容&#xff08;如客戶端只支持SSH-1&#xff0c…

Kubernetes --存儲入門

一、Volume 的概念對于大多數的項目而言&#xff0c;數據文件的存儲是非常常見的需求&#xff0c;比如存儲用戶上傳的頭像、文件以及數據庫的數據。在 Kubernetes 中&#xff0c;由于應用的部署具有高度的可擴展性和編排能力&#xff08;不像傳統架構部署在固定的位置&#xff…

螞蟻 KAG 框架開源:知識圖譜 + RAG 雙引擎

引言&#xff1a;從RAG到KAG&#xff0c;專業領域知識服務的技術突破 在大語言模型&#xff08;LLM&#xff09;應用落地過程中&#xff0c;檢索增強生成&#xff08;RAG&#xff09; 技術通過引入外部知識庫有效緩解了模型幻覺問題&#xff0c;但在專業領域仍面臨三大核心挑戰…

V-Ray 7.00.08 for 3ds Max 2021-2026 安裝與配置教程(含語言補丁)

本文介紹 V-Ray 7.00.08 渲染器在 3ds Max 2021-2026 各版本中的安裝與使用配置步驟&#xff0c;適合需要進行可視化渲染工作的設計師、建筑師及相關從業者。附帶語言補丁配置方式&#xff0c;幫助用戶獲得更順暢的使用體驗。 &#x1f4c1; 一、安裝文件準備 軟件名稱&#xf…

Go-Elasticsearch Typed Client查詢請求的兩種寫法強類型 Request 與 Raw JSON

1 為什么需要兩種寫法&#xff1f; 在 Golang 項目中訪問 Elasticsearch&#xff0c;一般會遇到兩類需求&#xff1a;需求場景特點最佳寫法后臺服務 / 業務邏輯查詢固定、字段清晰&#xff0c;需要編譯期保障Request 結構體儀表盤 / 高級搜索 / 模板 DSL查詢片段由前端或腳本動…

Leaflet 綜合案例-聚類圖層控制

看過的知識不等于學會。唯有用心總結、系統記錄&#xff0c;并通過溫故知新反復實踐&#xff0c;才能真正掌握一二 作為一名摸爬滾打三年的前端開發&#xff0c;開源社區給了我飯碗&#xff0c;我也將所學的知識體系回饋給大家&#xff0c;助你少走彎路&#xff01; OpenLayers…

React組件中的this指向問題

在 React 組件中&#xff0c;函數定義方式影響this指向的核心原因是箭頭函數與普通函數的作用域綁定規則不同&#xff0c;具體差異如下&#xff1a;? 1. 普通函數&#xff08;function定義&#xff09;需要手動bind(this)的原因? 當用function在組件內定義方法時&#xff1…

Vue 項目中的組件引用如何實現,依賴組件間的數據功能交互及示例演示

在 Vue 項目中&#xff0c;組件間的引用與數據交互是核心功能之一。以下是組件引用和數據交互的詳細實現方式及示例&#xff1a;一、組件引用方式 1. 基本組件引用 局部注冊&#xff1a;在父組件中按需引入子組件并注冊。 // ParentComponent.vue import ChildComponent from .…

? 使用 Flask 實現頭像文件上傳與加載功能

文章目錄&#x1f9f1; 技術棧&#x1f5c2;? 項目結構與配置&#x1f510; 用戶身份校驗邏輯&#x1f4e4; 頭像上傳接口&#xff1a;/file/avatar/upload&#x1f4e5; 加載頭像接口&#xff1a;/file/avatar/load/<filename>&#x1f9ea; 示例請求&#xff08;使用 …

去除視頻字幕 5: 使用 ProPainter, 記錄探索過程

使用 ProPainter 去除視頻上的字幕&#xff0c;效果演示&#xff08;比之前好多了。&#xff09;。 1. 項目目標 去除視頻 (bear.webm) 中的硬字幕。 2. 初始嘗試與關鍵失敗&#xff1a;IOPaint 方法: 使用 IOPaint&#xff08;一個圖像修復工具&#xff09;配合 PaddleOCR 逐…

JavaScript HTTP 請求:從老古董到新潮流

前端開發離不開跟后端打交道&#xff0c;HTTP 請求就是這座橋梁。JavaScript 提供了好幾種方式來發請求&#xff0c;從老牌的 XMLHttpRequest (XHR) 到現代的 Fetch API&#xff0c;再到各種好用的第三方庫&#xff08;像 Axios、Ky、Superagent&#xff09;。咱們一個一個聊清…

Windows10系統使用Cmake4.1.0構建工具+Visual Studio2022編譯Opencv4.11教程

安裝提示 后續安裝本Cmake和Opencv版本及以上都可以。Microsoft Visual Studio2022已默認安裝&#xff0c;沒有安裝給出教程鏈接。 一、Cmake4.1.0下載 1.官網下載&#xff1a;https://cmake.org/download/&#xff0c;找到cmake-4.1.0-rc3-windows-x86_64.zip版本 2.壓縮包…

【性能測試】Jmeter+Grafana+InfluxDB+Prometheus Windows安裝部署教程

一、工具作用與整體架構 1.1 各工具核心作用 工具作用描述關鍵特性Jmeter性能測試工具&#xff0c;模擬多用戶并發請求&#xff0c;生成測試數據支持HTTP/HTTPS、數據庫等多種協議&#xff0c;可自定義測試場景InfluxDB時序數據庫&#xff0c;專門存儲時間序列數據&#xff0…

【Kubernetes】使用Deployment進行的資源調度,資源清理,伸縮與更新管控

Kubernetes Deployment 實戰&#xff1a;從資源清理到伸縮與更新管控 一、基礎準備&#xff1a;清理閑置 ReplicaSet 在使用 Deployment 時&#xff0c;每次更新都會生成新的 ReplicaSet&#xff08;簡稱 RS&#xff09;&#xff0c;舊的 RS 會被保留但設置為 DESIRED0。這些閑…