Python 的下一代 HTTP 客户端
迷途小书童
读完需要
9
分钟速读仅需 3 分钟
1
环境
windows 10 64bit
python 3.8
httpx 0.23.0
2
简介
之前我们介绍过使用 requests ( https://xugaoxiang.com/2020/11/28/python-module-requests/ ) 来进行 http 操作,本篇介绍另一个功能非常类似的第三方库 httpx,它提供了同步和异步的 API,同时支持 HTTP/1.1 和 HTTP/2,是一个全功能的 HTTP 客户端。
3
安装
使用 pip 安装,执行命令
pip install httpx
在安装 python 库的同时,还安装了命令行工具 httpx.exe
来看几个简单的示例
# get方法请求url
httpx.exe https://github.com -m get# post方法请求url,同时上传一个文本文件
httpx.exe https://domain.com -m post -f test.txt
4
基本使用
还是拿之前的 flask 后端例子来讲
from flask import Flask, jsonify, request
from flask_restful import Api, Resource, reqparseUSERS = [{"name": "zhangsan"},{"name": "lisi"},{"name": "wangwu"},{"name": "zhaoliu"}
]class Users(Resource):def get(self):return jsonify(USERS)def post(self):args = reqparse.RequestParser() \.add_argument('name', type=str, location='json', required=True, help="名字不能为空") \.parse_args()if args['name'] not in USERS:USERS.append({"name": args['name']})return jsonify(USERS)def delete(self):USERS = []return jsonify(USERS)class UserId(Resource):def __init__(self):self.parser = reqparse.RequestParser()self.parser.add_argument('name', type=str)self.parser.add_argument('age', type=int)def get(self, userid):datas = self.parser.parse_args()return jsonify({"name": USERS[int(userid)].get('name'), "age": datas.get('age')})def post(self, userid):file = request.files['file']file.save('flask_file.txt')return jsonify({'msg' : 'success'})app = Flask(__name__)
api = Api(app, default_mediatype="application/json")api.add_resource(Users, '/users')
api.add_resource(UserId, '/user/<userid>')app.run(host='0.0.0.0', port=5000, use_reloader=True, debug=True)
启动后端服务后,接着来看看客户端的请求。httpx 的基本用法和 requests 近乎相同,很多时候,只需要将原来的代码中的 requests 换成 httpx 就行。
import httpx# 使用get方法
r = httpx.get('http://127.0.0.1:5000/users')# http返回码
print(r.status_code)# http头
print(r.headers['content-type'])
# 也可以使用 r.headers.get('content-type')# 接口返回的json
print(r.json())
import httpx
import jsonparam = {'name': 'xugaoxiang'}
headers = {"Content-type": "application/json"}# post请求
r = httpx.post('http://127.0.0.1:5000/users', data=json.dumps(param), headers=headers)print(r.status_code)
print(r.json())
import httpx# delete请求
r = httpx.delete('http://127.0.0.1:5000/users')
print(r.json())
print(r.status_code)
除此之外,像 put、head、options 方法的请求也是类似的,这里就不再举例了
r = httpx.put(url, data={'key': 'value'})
r = httpx.head(url)
r = httpx.options(url)
5
高级用法
上面示例中的用法是 httpx 提供的 top-level API,这在写一些测试脚本或者做系统原型时问题不大,但真正要在实际项目中去用的话,就会有性能上的问题。这是因为 httpx 在进行每一次的请求时都会去重新建立一个链接,也就是原有的链接没有被复用,这在高并发的情况就显得特别低效。
类似于 requests 模块中的 Session,httpx 提供了 Client,它会使用 http 连接池,大大减少链接重新建立的次数,减少 cpu 的使用率,降低了网络拥堵,提升系统效率。
Client 的使用比较简单,推荐的做法是将 Client 作为 context 管理器,看下面的示例
import httpxwith httpx.Client() as client:# 请求部分,将原来的 httpx 换成 client 就可以了,参数是一样的r = client.get('http://127.0.0.1:5000/users')print(r.json())print(r.status_code)
6
同步请求与异步请求
默认情况下,httpx 提供的是标准同步 API,如果想使用异步请求,可以这样
import httpx
import asyncioasync def make_async_request():async with httpx.AsyncClient() as client:r = await client.get('http://127.0.0.1:5000/users')print(r.json())print(r.status_code)asyncio.run(make_async_request())
7
http2 支持
要使能 http2,我们需要额外安装库 httpx[http2]
# 这个包名取的太奇怪了
pip install httpx[http2]
然后在初始化 client 的时候加上 http2 的支持
with httpx.Client(http2=True) as client:r = client.get('http://127.0.0.1:5000/users')
8
免费社群
相关文章:

Python 的下一代 HTTP 客户端
迷途小书童 读完需要 9分钟 速读仅需 3 分钟 1 环境 windows 10 64bitpython 3.8httpx 0.23.0 2 简介 之前我们介绍过使用 requests ( https://xugaoxiang.com/2020/11/28/python-module-requests/ ) 来进行 http 操作,本篇介绍另一个功能非常类似的第三方库 httpx&…...

网络安全---webshell实践
一、首先环境配置 1.上传文件并解压 2.进入目录下 为了方便解释,我们只用两个节点,启动之后,大家可以看到有 3 个容器(可想像成有 3 台服务器就成)。 二、使用蚁剑去连接 因为两台节点都在相同的位置存在 ant.jsp&…...
论AI GPT跨境贸易架构及其应用
摘要 2023年初,我司启动了智慧化跨境贸易供应链一体化平台的建设工作。我在该项目中担任系统架构设计师的职务,主要负责设计平台系统架构和安全体系架构。该平台以移动信息化发展为契机,采用”平台+AI”的模式解决现有应用的集中移动化需求。平台整体的逻辑复杂,对系统的高…...
github的CodeSpace如何对外提供TCP 端口服务?
github提供了codespace,一个IDE环境,可以远程以WEB的形式,运行VS code进行开发。 他会给你提供一个虚拟机,4核16G内存,还是很香的,比普通的VPS性能好多了。 缺点是没有独立的IP地址,无法对外进…...

借助Midjourney创作龙九子图
(本文阅读时间:5 分钟) 《西游记》中有这么一段描写: 龙王道:“舍妹有九个儿子。那八个都是好的。第一个小黄龙,见居淮渎;第二个小骊龙,见住济渎;第三个青背龙࿰…...

Azure存储访问层
blob数据的热访问层,冷访问层和存档访问层 Azure Blob 存储是一种托管对象存储服务,可用于存储和访问大量非结构化数据,如文本和二进制数据。Azure Blob 存储提供了三个不同层级的访问方式,以适应不同数据的使用模式和成本效益需…...
Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五)
文章目录 Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五)DLc: 消息类和通信类服务器客户端 Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五) DLc: 消息类和通信类 Message namespace Net {public class Message{p…...
中间件: Redis安装与部署
单机部署 yum install -y epel-release yum install -y redissed -i "s/bind 127.0.0.1/bind 0.0.0.0/g" /etc/redis.conf sed -i "s/# requirepass foobared/requirepass abcd1234/g" /etc/redis.conf systemctl restart redis集群部署 启动6个redis节点…...

Java日志框架-JUL
JUL全称Java util logging 入门案例 先来看着入门案例,直接创建logger对象,然后传入日志级别和打印的信息,就能在控制台输出信息。 可以看出只输出了部分的信息,其实默认的日志控制器是有一个默认的日志级别的,默认就…...

【Java】智慧工地SaaS平台源码:AI/云计算/物联网/智慧监管
智慧工地是指运用信息化手段,围绕施工过程管理,建立互联协同、智能生产、科学管理的施工项目信息化生态圈,并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析,提供过程趋势预测及专家预案,实现工程…...

Dodaf架构的学习分享
一.Dodaf的内容 Dodaf的背景 DODAF(Department of Defense Architecture Framework)起源于美国国防部,是一个用于支持复杂系统设计、规划和实施的架构框架。以下是DODAF的背景和起源: 复杂系统需求:在军事和国防领域&…...

听GPT 讲Prometheus源代码--discovery
Prometheus是一个开源的系统监控和警报工具包,以下是Prometheus源代码中一些主要的文件夹及其作用: cmd/:这个目录包含了Prometheus主要的命令行工具,如prometheus/,promtool/等。每个子目录都代表一个可执行的命令行应…...
HTTP 介绍
HTTP 介绍 HTTP 协议一般指 HTTP(超文本传输协议)。超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网…...
Rust语言深入解析:后向和前向链接算法的实现与应用
内容 - 第一部分 (1/3): Rust,作为一个旨在提供安全、并行和高性能的系统编程语言,为开发者带来了独特的编程模式和工具。其中,对于数据结构和算法的实现,Rust提供了一套强大的机制。本文将详细介绍如何在Rust中实现后…...

快速提高写作生产力——使用PicGo+Github搭建免费图床,并结合Typora
文章目录 简述PicGo下载PicGo获取Token配置PicGo结合Typora总结 简述PicGo PicGo: 一个用于快速上传图片并获取图片 URL 链接的工具 PicGo 本体支持如下图床: 七牛图床 v1.0腾讯云 COS v4\v5 版本 v1.1 & v1.5.0又拍云 v1.2.0GitHub v1.5.0SM.MS V2 v2.3.0-b…...
Java方法的参数可以有默认值吗?
在日常web开发这种,controller层接受参数时可以通过RequestParam(requiredfalse)设置参数非必填。 所以就想Java的方法可以有非必填这种操作吗?网上搜了一下,发现不支持这种操作。 可以通过方法重载的方式来变相实现。不需要传这个参数就会…...
电子商务的安全防范
(1)安全协议问题:我国大多数尚处在 SSL(安全套接层协议)的应用上,SET 协议的应用还只是刚刚试验成功,在信息的安全保密体制上还不成熟,对安全协议 还没有全球性的标准和规范,相对制约了国际性…...

STM32开关输入控制220V灯泡亮灭源代码(附带PROTEUSd电路图)
//main.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body************************************************************************…...

Spring Boot配置文件
目录 1.配置文件的作用 2.配置文件的格式 3.properties配置文件说明 3.1 properties基本语法 3.2 读取配置文件信息 3.3 properties 缺点分析 4.yml 配置⽂件说明 4.1 yml 基本语法 4.2 yml 使⽤进阶 4.2.1 yml 配置不同数据类型及 null 4.2.2 配置对象 5.propert…...

函数(2)
6. 函数的声明和定义 6.1 函数声明: 1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数 声明决定不了。 2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。 3. 函数的声明一般要放…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...