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。这些闲…