httpx 1.0

💡 原文英文,约1300词,阅读约需5分钟。
📝

内容提要

httpx 1.0 将引入多项破坏性变更:verify/cert 改用 SSLContext,proxies 改为 proxy/mounts,app 改为 transport,重命名 allow_redirects 并默认关闭,JSON 紧凑化,查询编码遵循 WHATWG,netrc 需显式启用,QueryParams 不可变,同步异步拆分为独立包,请求体改用 typed content 对象。这些改动引发争议,尤其拆分可能造成生态碎片化。

🔎

延伸解读

破坏性变更背后的设计取舍

httpx 1.0 的改动并非随意为之,而是基于对安全性和可预测性的考量。例如,verify/cert 改用 SSLContext 是为了更灵活地控制 TLS 配置;allow_redirects 默认关闭是为了避免意外发送重复请求(如支付 POST)。这些变更体现了维护者“显式优于隐式”的设计哲学,但同时也意味着用户需要调整现有代码。

同步异步拆分引发的生态担忧

将同步和异步拆分为独立包(httpx 和 ahttpx)是争议最大的改动。由于 Python 无法同时安装两个版本,这可能导致生态碎片化,类似 Pydantic 1→2 的过渡期。SDK 维护者(如 OpenAI、Anthropic)已表示担忧,并提出了替代方案(如 httpx2 或版本化命名空间)。目前尚未有最终决定,用户应关注后续进展。

新 API 的迁移要点

迁移到 httpx 1.0 时,需注意几个关键变化:proxies 参数拆分为 proxy 和 mounts;app 参数改为 transport;QueryParams 变为不可变,需使用 merge 等方法;请求体改用 typed content 对象(如 httpx.JSON)。建议提前规划迁移路径,并利用官方迁移指南或工具减少工作量。

Q&A

httpx 1.0 中 verify 和 cert 参数有什么变化?

在 httpx 1.0 中,verify 和 cert 参数被弃用,改为要求显式传入 ssl.SSLContext 对象。例如,要使用自定义 CA 证书,需要先创建 SSLContext 并加载证书,然后传给 verify。客户端证书也通过 SSLContext 的 load_cert_chain 方法加载。布尔值 verify=True/False 仍然有效。

httpx 1.0 中 proxies 参数被什么替代?

httpx 1.0 中,旧的 proxies 字典参数被 proxy 和 mounts 参数替代。proxy 用于设置单一代理,mounts 用于按 URL 模式配置不同的传输(如 HTTPTransport 和 HTTPSTransport),每个传输可以有自己的代理设置。

httpx 1.0 中如何测试 ASGI 或 WSGI 应用?

在 httpx 1.0 中,app 参数被移除,改为通过 transport 参数显式指定 ASGITransport 或 WSGITransport。例如:httpx.Client(transport=httpx.ASGITransport(app=my_asgi_app), base_url="http://testserver")。

httpx 1.0 中重定向处理有什么变化?

httpx 1.0 将 allow_redirects 参数重命名为 follow_redirects,并且默认值从 True 改为 False。这意味着默认情况下不再自动跟随重定向,需要显式设置 follow_redirects=True 或客户端级别设置。这是为了避免意外发送重复请求(如 POST 请求被重定向两次)。

httpx 1.0 中 JSON 请求体序列化有什么变化?

httpx 1.0 中 JSON 请求体序列化变得更紧凑,不再添加多余空格。例如,json={"a": 1, "b": 2} 现在会序列化为 {"a":1,"b":2},而不是 {"a": 1, "b": 2}。

httpx 1.0 中查询字符串编码规则有什么变化?

httpx 1.0 遵循 WHATWG 规范,空格编码为 %20 而不是 +,斜杠 / 在查询部分不再转义为 %2F。例如,?q=hello world 会变成 ?q=hello%20world,而 ?path=a/b 保持原样。这与浏览器行为一致。

httpx 1.0 中 .netrc 文件处理有什么变化?

httpx 1.0 不再自动读取 ~/.netrc 文件,需要显式使用 httpx.NetRCAuth() 作为 auth 参数。例如:httpx.get(url, auth=httpx.NetRCAuth())。

httpx 1.0 中 QueryParams 有什么变化?

httpx 1.0 中 QueryParams 变为不可变对象。之前可以原地修改(如 client.params.update()),现在需要使用 merge 方法创建新对象,或者使用 set、add、remove 等方法返回新对象。

httpx 1.0 中同步和异步客户端拆分有什么争议?

httpx 1.0 计划将同步和异步客户端拆分为两个独立的包:httpx(同步)和 ahttpx(异步)。这引发了争议,因为 Python 无法同时安装两个版本的同一包,可能导致生态碎片化,类似 Pydantic 1→2 的情况。一些 SDK 维护者(如 OpenAI 和 Anthropic)反对这一拆分,提出了替代方案,如使用不同名称(httpx2)或保留在同一包内。

httpx 1.0 中请求体参数有什么变化?

httpx 1.0 将 json、data、files 等参数替换为统一的 content 参数,并配合类型化对象使用,如 httpx.JSON、httpx.Form、httpx.Files 和 httpx.MultiPart。例如:client.post(url, content=httpx.JSON({"key": "value"}))。

🏷️

标签

➡️

继续阅读