作为新生代的网络请求库,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 都配置请求参数时,可能会发生如下两种情况:

  1. 对于 headersparamscookies, 这些值将组合到一起
>>> 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'})
  1. 对于其他参数,request 优先

Event hooks

httpx 允许你在 cient 中注册钩子函数,发生特定类型的事件后会自动调用这些函数

目前有两个事件类型:

  1. request,即将发生请求时调用
  2. 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.contentresponse.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的新生代网络请求库相关推荐

  1. Python网络请求库Requests,妈妈再也不会担心我的网络请求了(二)

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 接着上篇说,如果你真以为Requests网络请求库只有Get请求和Post请求 ...

  2. Python网络请求库Requests,妈妈再也不会担心我的网络请求了(一)

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 网络请求可能是每门语言比较重要的一部分了,在Python语言中,虽然有urll ...

  3. 「Python 编程」编码实现网络请求库中的 URL 解析器

    相信各位 Python 开发者都用过 Requests 库,有些朋友还用过 WebSockets 库.这里回顾一下它们的基本用法,例如使用 Requests 库向目标网站发出 GET 请求: impo ...

  4. python的网络请求库urllib、urllib2、urllib3、request的联系

    文章目录 1. 简介 2. urllib 3. urllib2 4. urllib3 5. requests 6. 相关文章 1. 简介 urllib.urllib2.urllib3.request均 ...

  5. android post请求添加公共参数_XHttp2 一个功能强悍的网络请求库

    XHttp2 一个功能强悍的网络请求库,使用RxJava2 + Retrofit2 + OKHttp组合进行封装.还不赶紧点击使用说明文档,体验一下吧! 项目地址 关于我 https://github ...

  6. 兼容微信小程序的流式网络请求库

    本项目从属于笔者的Web开发入门与最佳实践之前端开源项目系列.如果对于HTTP协议与规范尚不掌握的建议阅读HTTP 基础与变迁一文.如果对于REST尚不掌握的推荐阅读来自微软的接口设计指南以及来自于P ...

  7. 吕文翰 php,自己动手写一个 iOS 网络请求库(三)——降低耦合

    自己动手写一个 iOS 网络请求库(三)--降低耦合 2015-5-22 / 阅读数:16112 / 分类: iOS & Swift 本文中,我们将一起降低之前代码的耦合度,并使用适配器模式实 ...

  8. swift中网络请求库的封装(Alamofire+HandyJSON)

    swift中网络请求库的封装(Alamofire+HandyJSON) 我们用swift语言来写iOS的程序,会用Alamofire+HandyJSON来取代AFNetworking+MJExtens ...

  9. 流行框架(二)网络请求库 OKhttp

    文章目录 概述 HttpURLConnection GET和POST获取文本数据 GET POST OKHttp 基本使用 依赖与权限 发起一个get请求 重要概念 OkHttpClient Requ ...

最新文章

  1. linux curl没有内容,curl在tcpdump中没有显示输出
  2. 基因注释神器UCSC Genome Browser使用教程
  3. [BZOJ2616] SPOJ PERIODNI
  4. python 遍历usb设备_python程序员教你写脚本玩微信跳一跳,只要有耐心,你就是王者!...
  5. ls mac 显示最近修改日期_如何在Mac上按日期排序文件 | MOS86
  6. bulk Java提交数据,性能优化 – bulk提交 - ELK Stack 中文指南
  7. qt qtoolbutton 弹出菜单方向_QT使用教程(三)之安装篇
  8. “死机短信”缠上山寨手机 往下翻就死机黑屏
  9. CSS 的 hsl() 和 hsla() 函数(设置颜色的方式之一)
  10. K3 CLOUD返工生产成本方案——循环计算
  11. 航摄比例尺、成图比例尺、地面分辨率与航摄设计用图比例尺
  12. Sensible, not sensitive; simply complicated; predictably irrational; kindly demanding; constructivel
  13. 电脑老是弹出vrvedp_m_卸载瑞星的最简单方法 vrvedp_m卸载
  14. 51nod 1108.距离之和最小 V2 - 曼哈顿距离
  15. 6360. 【NOIP2019模拟2019.9.18】最大菱形和(rhombus)
  16. spring循环依赖让你更好的理解spring!!
  17. curl: (7) Failed to connect to 2600:1f1c:2d4:8900:17a1:2e94:9f90:f91e: 网络不可达
  18. 易语言到字节集c,易语言教程取字节集长度取字节集数据到字节集
  19. .mdf和.ldf数据库文件导入到SQL Server数据库
  20. MovieMator Video Editor Pro for Mac(专业视频编辑软件) v2.5.4中文激活版

热门文章

  1. 删那些CYDIA看不到的 插件方法。
  2. 【开源免费】kettle作业调度—自动化运维—数据挖掘—informatica-批量作业工具taskctl
  3. 【MySQL系列】第一节.MySQL数据库基础
  4. 用Python实现城市方向熵的计算
  5. 组合框控件ComboBox
  6. 打印机显示服务器脱机怎么修复,打印机脱机了如何恢复
  7. 阿里面试,70%的都是一轮游
  8. wch-link替代st-link(实际支持大部分arm核芯片)
  9. partition(1)partitioning_strategies
  10. android monitor的使用方法,Android Device Monitor使用方法及常见问题解决方案