Python中的HTTP客户端库:httpx与request | python小知识

Python中的HTTP客户端库:httpx与request | python小知识

在Python中,发送HTTP请求和处理响应是网络编程的基础。requestshttpx是两个常用的HTTP库,它们都提供了简洁易用的API来发送HTTP请求。然而,httpx作为新一代的HTTP客户端库,在功能和性能上都有所提升。本文将详细介绍httpxrequests的区别,并通过对比展示httpx的优势。

1. requests库简介

requests是一个非常流行的Python HTTP库,它基于urllib3库实现,提供了许多方便的功能,并且非常易于使用。requests库支持HTTP连接保持和连接池,能够自动处理cookies、文件上传、自动确定响应内容的编码以及国际化的URL和POST数据自动编码。requests库自称为“HTTP for Humans”,即让HTTP服务于人类,说明其设计目标是简洁和方便。

安装requests库

pip install requests

使用requests库发送HTTP请求

import requests

# 发送GET请求
response = requests.get('https://www.example.com')
print(response.status_code)  # 输出响应状态码
print(response.text)  # 输出响应文本

# 发送POST请求
data = {'key': 'value'}
headers = {'Content-Type': 'application/json'}
response = requests.post('https://www.example.com', json=data, headers=headers)
print(response.status_code)  # 输出响应状态码
print(response.text)  # 输出响应文本

2. httpx库简介与对比

httpx是一个新一代的Python HTTP客户端库,它支持同步和异步两种方式发送HTTP请求,并且提供了许多现代化的特性。与requests相比,httpx在以下几个方面有所提升:

2.1 异步支持

requests库只能使用同步方式发送HTTP请求,而httpx则既可以使用同步方式,也可以使用异步方式。这意味着httpx可以在处理需要等待的操作时不会阻塞程序,从而提高效率。

示例:使用httpx发送异步HTTP请求

import httpx
import asyncio

# 定义异步函数
async def fetch(url):
    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        return response.json()

# 定义并发任务
async def main():
    urls = ['https://api.github.com', 'https://httpbin.org/get']
    tasks = [fetch(url) for url in urls]
    results = await asyncio.gather(*tasks)
    for result in results:
        print(result)

# 执行异步任务
asyncio.run(main())

2.2 HTTP/2支持

requests库只支持HTTP/1.1协议,而httpx则支持HTTP/2协议。HTTP/2提供了许多性能改进,比如多路复用和服务端推送,这些都可以提高HTTP通信的效率。

2.3 性能提升

httpx使用httptools库来解析和处理HTTP报文,而requests则使用urllib3库。httptools库在解析和处理HTTP报文方面有更好的性能,因此httpx可能会比requests更快。

2.4 兼容性

httpx的API设计与requests类似,因此从requests迁移到httpx的成本几乎是零。你可以很容易地将现有的requests代码替换为httpx代码,而无需做太多修改。

2.5 丰富的功能

httpx还支持多种认证方式(如Basic、Digest、JWT、OAuth等)、中间件挂载、设置请求的超时时间、自动处理重定向以及设置代理服务器等功能。这些功能使得httpx在处理复杂的HTTP请求时更加灵活和强大。

2.6 更多例子

当然可以,以下是使用httpx库进行POST请求的更多示例,包括同步和异步两种方式。

同步POST请求示例
示例1:发送表单数据
import httpx

# 目标URL
url = 'https://example.com/api/form'

# 表单数据
form_data = {
    'username': 'testuser',
    'password': 'testpass'
}

# 使用httpx发送同步POST请求(表单数据)
with httpx.Client() as client:
    response = client.post(url, data=form_data)  # 注意这里使用data参数发送表单数据

# 打印响应状态码和响应内容
print(response.status_code)
print(response.text)  # 假设服务器返回的是文本格式的响应体
示例2:发送JSON数据并设置请求头
import httpx

# 目标URL
url = 'https://example.com/api/json'

# JSON数据
json_data = {
    'name': 'John Doe',
    'age': 30
}

# 自定义请求头
headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_token_here'
}

# 使用httpx发送同步POST请求(JSON数据+自定义请求头)
with httpx.Client() as client:
    response = client.post(url, json=json_data, headers=headers)  # json参数会自动设置Content-Type为application/json

# 打印响应状态码和响应内容
print(response.status_code)
print(response.json())  # 假设服务器返回的是JSON格式的响应体
异步POST请求示例
示例1:发送JSON数据
import httpx
import asyncio

# 异步函数,用于发送POST请求(JSON数据)
async def fetch_json(url, data):
    async with httpx.AsyncClient() as client:
        response = await client.post(url, json=data)
        return response

# 目标URL
url = 'https://example.com/api/json'

# JSON数据
json_data = {
    'name': 'Jane Doe',
    'email': 'jane.doe@example.com'
}

# 使用asyncio运行异步函数
async def main():
    response = await fetch_json(url, json_data)
    # 打印响应状态码和响应内容
    print(response.status_code)
    print(response.json())  # 假设服务器返回的是JSON格式的响应体

# 运行异步主函数
asyncio.run(main())
示例2:发送文件数据
import httpx
import asyncio

# 异步函数,用于发送POST请求(文件数据)
async def upload_file(url, file_path):
    async with httpx.AsyncClient() as client:
        with open(file_path, 'rb') as file:
            files = {'file': ('filename', file, 'application/octet-stream')}
            response = await client.post(url, files=files)
    return response

# 目标URL
url = 'https://example.com/api/upload'

# 文件路径
file_path = '/path/to/your/file.txt'

# 使用asyncio运行异步函数
async def main():
    response = await upload_file(url, file_path)
    # 打印响应状态码和响应内容
    print(response.status_code)
    print(response.text)  # 假设服务器返回的是文本格式的响应体

# 运行异步主函数
asyncio.run(main())

在这些示例中,我们展示了如何使用httpx库发送不同类型的POST请求,包括表单数据、JSON数据、自定义请求头以及文件上传。无论是同步还是异步方式,httpx都提供了简洁且强大的API来满足各种HTTP请求需求。

3. 总结

综上所述,httpx作为新一代的Python HTTP客户端库,在异步支持、HTTP/2支持、性能提升以及功能丰富性等方面都优于requests库。如果你正在寻找一个强大且灵活的HTTP客户端库来处理你的Python网络编程需求,那么httpx无疑是一个值得考虑的选择。

无论你是初学者还是经验丰富的开发者,都可以通过学习和使用httpx来提升你的Python网络编程技能。希望这篇博客能够帮助你更好地理解和使用httpx库!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968824.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows10本地的JMeter+Influxdb+Grafana压测性能测试,【亲测,避坑】

一、环境,以下软件需要解压、安装到电脑上。 windows10 apache-jmeter-5.6.3 jdk-17.0.13 influxdb2-2.7.11 grafana-enterprise-11.5.1二、配置Influxdb,安装完默认连接http://localhost:8086/。打开连接,配置如下。 1、配置bucket&#x…

excel如何拆分为1000行一个的文件

方法一:使用hpctb 打开文件,点“行分表”就行了。如图: 一步完成,不需要安装环境,也不需要专业知识,也不需要“神”一样的ai。 方法二:使用Python 安装库(如未安装) pip install p…

docker nginx 配置文件详解

在平常的开发工作中,我们经常需要访问静态资源(图片、HTML页面等)、访问文件目录、部署项目时进行负载均衡等。那么我们就会使用到Nginx,nginx.conf 的配置至关重要。那么今天主要结合访问静态资源、负载均衡等总结下 nginx.conf …

分布式 IO:矿山砂石装备高效控制的新引擎

在砂石与矿山行业这片充满挑战与机遇的领域,装备的高效运行和精准控制一直是企业追求的核心目标。随着科技的飞速发展,明达技术推出的MR30分布式 IO 模块作为一种先进的控制技术,正逐渐崭露头角,为砂石、矿山装备的升级改造带来了…

微信小程序配置3 配置sass

1. 在config。json文件里面的setting配置“sass” 2. 改你需要的页面后缀名为scss。 3.查看页面即可看到样式。

VS Code 通知中一直显示“Reactivating terminals...”的问题解决

VS Code 通知中一直显示“Reactivating terminals...”的问题解决 问题截图解决方案修复截图相关链接 问题截图 解决方案 点击顶部放大镜(🔍) -> 输入尖括号(>) -> 然后搜索(Python: Clear Workspace Interpreter Setting) -> 最后点击即可 修复截图…

小白学网络安全难吗?需要具备哪些条件?

作为一名零基础小白,想要转行IT学习一门新技术,且上手难度低、就业前景好、薪资待遇高、入行门槛低,网络安全是最值得的选择,掌握它之后你可以获得一份收入不错的工作。那么零基础学网络安全好学吗?以下是具体内容介绍。 首先&am…

服务器,交换机和路由器的一些笔记

服务器、交换机和路由器是网络中常用的设备,它们的本质区别和联系如下: 本质区别 功能不同 服务器:就像一个大型的资料仓库和工作处理中心,主要用来存储和管理各种数据,比如网站的网页数据、公司的办公文档等&#x…

untiy3D为游戏物体制作简单的动画

1.创建一个物体挂载动画组件Animator 2.创建一个动画控制器 3.动画控制器挂载到Animator组件 4.创建动画窗口>动画 入口默认执行left 执行效果 20250212_151707 脚本控制动画 鼠标点击是切换到动画t using System.Collections; using System.Collections.Generic; usi…

2、k8s 二进制安装(详细)

k8s 二进制安装 IP规划初始化部署 etcd 集群在 etcd01 节点上操作准备cfssl证书生成工具,加权生成etcd证书上传etcd软件包启动 etcd 服务 部署 Master 组件部署 Worker Node 组件node 节点安装 docker部署组件 部署 CNI 网络组件部署 flannel简介部署 部署 Calico简…

3.React 组件化开发

react:版本 18.2.0node: 版本18.19.1脚手架:版本 5.0.1 一、类组件 (一) 一个干净的脚手架 【1】使用已经被废弃的 CRA (create-react-app) create-react-app 已经被废弃,且目前使用会报错,官方已经不推荐使用&…

第二天:工具的使用

每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中,对于爬虫有兴趣的伙伴可以订阅专栏一起学习,完全免费。 键盘为桨,代码作帆。这趟为期30天左右的Python爬虫特训即将启航,每日解锁新海域:从Requests库的…

AI前端开发:赋能开发者,提升解决实际问题的能力

近年来,人工智能技术飞速发展,深刻地改变着各行各业。在软件开发领域,AI写代码工具的出现更是引发了一场革命,尤其是前端开发领域,AI的应用正在显著提升开发者的解决实际问题的能力。本文将探讨AI前端开发如何提升效率…

20vue3实战-----使用echarts搭建各种图表

20vue3实战-----使用echarts搭建各种图表 1.实现目标2.实现步骤2.1封装组件2.2使用组件 1.实现目标 如上,页面上有各种各样类型的图标。这时候需要用到echarts库作为辅助。 2.实现步骤 首先安装echarts库的步骤就不用多说。 2.1封装组件 page-echarts/index.ts: import Bas…

【Qt 常用控件】多元素控件(QListWidget、QTableWidgt、QTreeWidget)

**View和**Widget的区别? **View的实现更底层,**Widget是基于**View封装实现的更易用的类型。 **View使用MVC结构 MVC是软件开发中 经典的 软件结构 组织形式,软件设计模式。 M(model)模型。管理应用程序的核心数据和…

Flappy Bird开发学习记录

概述 为了了解一下Unity的开发过程,或者说感受?先搞简单的练练手。 工具 Unity:2022.3.51f1c1 visual studio 2022 开发过程 项目基本设置 新建2d项目,游戏画面设置为1080*1920(9:16)。 图片素材设…

35~37.ppt

目录 35.张秘书-《会计行业中长期人才发展规划》 题目​ 解析 36.颐和园公园(25张PPT) 题目​ 解析 37.颐和园公园(22张PPT) 题目 解析 35.张秘书-《会计行业中长期人才发展规划》 题目 解析 插入自定义的幻灯片:新建幻灯片→重用…

19.4.6 读写数据库中的二进制数据

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 需要北风数据库的请留言自己的信箱。 北风数据库中,类别表的图片字段在【数据表视图】中显示为Bitmap Image&#xff1…

sqli-lab靶场学习(六)——Less18-22(User-Agent、Referer、Cookie注入)

前言 前面的关卡,都是直接在输入框或者浏览器的地址栏上做文章即可。但本文这几关,需要用工具拦截请求修改请求头部才行。 Less18(User-Agent注入) 本关的注入点在User-Agent。我们在用户名和密码框中输入admin/admin后&#xf…

uniapp 使用 鸿蒙开源字体

uniapp vue3 使用 鸿蒙开源字体 我的需求是全局使用鸿蒙字体。 所以: 0. 首先下载鸿蒙字体: 鸿蒙资源 下载后解压,发现里面有几个文件夹: 字体名称说明Sans默认的鸿蒙字体,支持基本的多语言字符(包括字…