HTTPX: 青出于蓝,比肩requests的新生代网络请求库
作为新生代的网络请求库,HTTPX 不仅支持 requests 的所有操作,同时支持 异步API 及 HTTP/2。根据官网的描述,总结有如下特点:
- 标准的同步接口及异步支持
- HTTP/1.1 和 HTTP/2
- 直接向 WSGI/ASGI 应用程序发出请求
- 严格的超时设置
- 全类型注释
- 100% 测试覆盖率
文章目录
- 快速开始
- 安装
- 基本使用
- 发起请求
- 传递参数
- 响应
- 重定向
- 超时
- 进阶
- Client
- 用法
- 共享配置
- 合并配置
- Event hooks
- Http proxy
- Stream
快速开始
>>> import httpx
>>> r = httpx.get('https://github.com')
>>> r
<Response [200 OK]>
>>> r.status_code
200
>>> r.text
<!DOCTYPE html>\n<html lang="en" class="html-fluid"> ...
或者,使用异步API
>>> async with httpx.AsyncClient() as client:
>>> r = await client.get('https://github.com')
>>> r
<Response [200 OK]>
以及, HTTP/2
>>> client = httpx.Client(http2=True)
>>> r = client.get('https://github.com')
>>> r
<Response [200 OK]>
>>> r.http_version
HTTP/2
安装
使用 pip 安装
pip install httpx
[可选] http2 支持
pip install httpx[http2]
[可选] brotli 解码器支持
pip install httpx[brotli]
基本使用
发起请求
>>> httpx.get('*')
>>> httpx.post('*')
>>> httpx.put('*')
>>> httpx.delete('*')
>>> httpx.head('*')
>>> httpx.options('*')
传递参数
# get 参数
httpx.get(url, params={'key1': 'value1', 'key2': ['1', '2']})# post 参数
httpx.post(url, data={'username': '123'})# json 参数
httpx.post(url, json={'query': 'hello'})# 文件
httpx.post(url, files={'file': open('report.xls', 'rb')})# headers
httpx.get(url, headers={'User-agent': 'baiduspider'})# cookies
httpx.get(url, cookies={'sessionid': '***'})
响应
>>> r = httpx.get('https://github.com')>>> r.url
URL('https://github.com')>>> r.encoding
utf-8>>> r.status_code
200# 文本响应
>>> r.text# 二进制响应
>>> r.content# JSON 响应
>>> r.json()
重定向
默认情况下,HTTPX 遵循所有 http 方法的重定向
history
属性可用于展示请求发生的重定向,它包含重定向响应的列表,按照响应的顺序排列
例如, Github 自动将 http 请求重定向到 https
>>> r = httpx.get('http://github.com')
>>> r.url
URL('https://github.com/')
>>> r.status_code
200
>>> r.history
[<Response [301 Moved Permanently]>]
可以使用 allow_redirects
参数禁止默认重定向
>>> r = httpx.get('http://github.com', allow_redirects=False)
>>> r.url
URL('http://github.com/')
>>> r.status_code
301
>>> r.history
[]
>>> r.next_request
<Request('GET', 'https://github.com/')>
超时
HTTPX 允许你以更细的粒度控制不同类型的超时行为,分别是 connect
, read
, write
, pool
connect: 建立一个套接字连接的最大时间,超时抛出 ConnectTimeout 异常
read: 接收数据块的最大时间,超时抛出 ReadTimeout 异常
write: 发送数据块的最大时间,超时抛出 WriteTimeout 异常
pool: 获取连接池中连接的最大时间,超时抛出 PoolTimeout 异常
# 指定 connect 60 秒超时, 其它 10 秒超时
timeout = httpx.Timeout(10, connect=60)
r = httpx.get(url, timeout=timeout)
进阶
Client
当通过 httpx.get 的方式发起请求时,HTTPX 必须为每一个请求建立新连接(连接不会被重用),随着请求数量的增加,很快就会变得低效
Client
使用 HTTP 连接池,当你对同一主机发出多个请求时,client 将重用底层 TCP 连接,这可以带来非常显著的性能提升,包括:
- 减少请求的延迟(无握手)
- 减少 CPU 使用率和往返次数
- 减少网络拥塞
以及
- 跨请求的 Cookie 持久性
- 配置所有请求
- 使用 http 代理
- 使用 http/2
如果你使用 requests,
httpx.client
可以用来代替requests.Session
用法
(1) 使用上下文管理器
with httpx.Client() as client:...
(2) 显式关闭连接
client = httpx.client()
try:...
finally:client.close()
共享配置
Client 允许您传入参数应用于所有发出的请求
headers = {'user-agent': 'httpx/0.18.1'}
with httpx.Client(headers=headers) as client:r = client.get(url)
合并配置
当 cient 和 request 都配置请求参数时,可能会发生如下两种情况:
- 对于
headers
,params
,cookies
, 这些值将组合到一起
>>> headers = {'user-agent': 'httpx/0.18.1'}
>>> with httpx.Client(headers=headers) as client:
>>> r = client.get(url, headers={'Content-Type': 'application/json'})
>>> print(r.headers)
Headers({..., 'user-agent': 'httpx/0.18.1', 'content-type': 'application/json'})
- 对于其他参数,request 优先
Event hooks
httpx 允许你在 cient 中注册钩子函数,发生特定类型的事件后会自动调用这些函数
目前有两个事件类型:
request
,即将发生请求时调用response
,发生响应后调用
event hook 只读
>>> def log_request(request):
>>> print(f'Request event hook: {request.method} - {request.url} sending..')>>> def log_response(response):
>>> request = response.request
>>> print(f"Response event hook: {request.method} {request.url} - Status {response.status_code}")>>> with httpx.Client(event_hooks={'request': [log_request]}) as client:
>>> client.get('https://github.com')
>>> print(r.status_code)Request event hook: GET - https://github.com sending..
Response event hook: GET https://github.com - Status 200
200
event hooks 为一个列表,你可以为每种类型的事件注册多个钩子函数
Http proxy
# 代理全部请求
httpx.Client(proxies="http://localhost:8030")# 按协议指定代理
proxies = {"http://": "http://localhost:8030","https://": "http://localhost:8031",
}# 复杂代理
proxies = {# 代理指定端口"all://*:1234": "http://localhost:8030",# 代理指定二级域名"all://*.example.com": "http://localhost:8030",# 指定 http 协议不设置代理"http://*": None
}
Stream
当我们请求大文件时,无需直接把它们读入内存,可以采用数据流的方式,返回一点读取一点,直至取完全部内容。
你可以流式传输响应的二进制数据:
>>> with httpx.stream("GET", "https://www.example.com") as r:
>>> for data in r.iter_bytes():
>>> print(data)
当你使用流响应的时候,response.content
和 response.text
将不可用,但是你也可以在流中有条件地加载响应正文:
>>> with httpx.stream("GET", "https://www.example.com") as r:
>>> if r.headers['Content-Length'] < TOO_LONG:
>>> r.read()
>>> print(r.text)
HTTPX: 青出于蓝,比肩requests的新生代网络请求库相关推荐
- Python网络请求库Requests,妈妈再也不会担心我的网络请求了(二)
本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 接着上篇说,如果你真以为Requests网络请求库只有Get请求和Post请求 ...
- Python网络请求库Requests,妈妈再也不会担心我的网络请求了(一)
本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 网络请求可能是每门语言比较重要的一部分了,在Python语言中,虽然有urll ...
- 「Python 编程」编码实现网络请求库中的 URL 解析器
相信各位 Python 开发者都用过 Requests 库,有些朋友还用过 WebSockets 库.这里回顾一下它们的基本用法,例如使用 Requests 库向目标网站发出 GET 请求: impo ...
- python的网络请求库urllib、urllib2、urllib3、request的联系
文章目录 1. 简介 2. urllib 3. urllib2 4. urllib3 5. requests 6. 相关文章 1. 简介 urllib.urllib2.urllib3.request均 ...
- android post请求添加公共参数_XHttp2 一个功能强悍的网络请求库
XHttp2 一个功能强悍的网络请求库,使用RxJava2 + Retrofit2 + OKHttp组合进行封装.还不赶紧点击使用说明文档,体验一下吧! 项目地址 关于我 https://github ...
- 兼容微信小程序的流式网络请求库
本项目从属于笔者的Web开发入门与最佳实践之前端开源项目系列.如果对于HTTP协议与规范尚不掌握的建议阅读HTTP 基础与变迁一文.如果对于REST尚不掌握的推荐阅读来自微软的接口设计指南以及来自于P ...
- 吕文翰 php,自己动手写一个 iOS 网络请求库(三)——降低耦合
自己动手写一个 iOS 网络请求库(三)--降低耦合 2015-5-22 / 阅读数:16112 / 分类: iOS & Swift 本文中,我们将一起降低之前代码的耦合度,并使用适配器模式实 ...
- swift中网络请求库的封装(Alamofire+HandyJSON)
swift中网络请求库的封装(Alamofire+HandyJSON) 我们用swift语言来写iOS的程序,会用Alamofire+HandyJSON来取代AFNetworking+MJExtens ...
- 流行框架(二)网络请求库 OKhttp
文章目录 概述 HttpURLConnection GET和POST获取文本数据 GET POST OKHttp 基本使用 依赖与权限 发起一个get请求 重要概念 OkHttpClient Requ ...
最新文章
- linux curl没有内容,curl在tcpdump中没有显示输出
- 基因注释神器UCSC Genome Browser使用教程
- [BZOJ2616] SPOJ PERIODNI
- python 遍历usb设备_python程序员教你写脚本玩微信跳一跳,只要有耐心,你就是王者!...
- ls mac 显示最近修改日期_如何在Mac上按日期排序文件 | MOS86
- bulk Java提交数据,性能优化 – bulk提交 - ELK Stack 中文指南
- qt qtoolbutton 弹出菜单方向_QT使用教程(三)之安装篇
- “死机短信”缠上山寨手机 往下翻就死机黑屏
- CSS 的 hsl() 和 hsla() 函数(设置颜色的方式之一)
- K3 CLOUD返工生产成本方案——循环计算
- 航摄比例尺、成图比例尺、地面分辨率与航摄设计用图比例尺
- Sensible, not sensitive; simply complicated; predictably irrational; kindly demanding; constructivel
- 电脑老是弹出vrvedp_m_卸载瑞星的最简单方法 vrvedp_m卸载
- 51nod 1108.距离之和最小 V2 - 曼哈顿距离
- 6360. 【NOIP2019模拟2019.9.18】最大菱形和(rhombus)
- spring循环依赖让你更好的理解spring!!
- curl: (7) Failed to connect to 2600:1f1c:2d4:8900:17a1:2e94:9f90:f91e: 网络不可达
- 易语言到字节集c,易语言教程取字节集长度取字节集数据到字节集
- .mdf和.ldf数据库文件导入到SQL Server数据库
- MovieMator Video Editor Pro for Mac(专业视频编辑软件) v2.5.4中文激活版
热门文章
- 删那些CYDIA看不到的 插件方法。
- 【开源免费】kettle作业调度—自动化运维—数据挖掘—informatica-批量作业工具taskctl
- 【MySQL系列】第一节.MySQL数据库基础
- 用Python实现城市方向熵的计算
- 组合框控件ComboBox
- 打印机显示服务器脱机怎么修复,打印机脱机了如何恢复
- 阿里面试,70%的都是一轮游
- wch-link替代st-link(实际支持大部分arm核芯片)
- partition(1)partitioning_strategies
- android monitor的使用方法,Android Device Monitor使用方法及常见问题解决方案