httpx保姆级教程:从零开始掌握这个强大的Python HTTP客户端
嘿,朋友们!今天咱们来聊聊一个特别实用的Python库——httpx,说实话,我一开始也是被requests惯坏了,觉得发个HTTP请求还能有多复杂?结果踩了不少坑之后才发现,httpx这玩意儿是真的香!所以今天我就来给大家写一篇httpx保姆级教程,保证你看完就能上手,少走弯路。

为啥要用httpx?先聊聊我的真实感受
你知道吗,之前我一直用requests,写得也挺顺手的,但是后来项目里需要异步请求,requests就有点力不从心了,这时候朋友给我推荐了httpx,我一开始还不太情愿换,心想又得学新东西……结果用了一周之后,真香警告!httpx不仅支持同步和异步两种模式,API设计还特别人性化,跟requests非常像,迁移成本低得感人,而且它还支持HTTP/2,这在性能敏感的场景下简直不要太爽。
安装?一行命令搞定的事儿
安装httpx真的超级简单,打开终端敲一行命令就行:
pip install httpx
对,就这么简单!不需要折腾什么乱七八糟的依赖,pip一装就完事儿,如果你还需要HTTP/2支持,那就再加个括号:
pip install httpx[http2]
搞定!是不是一点门槛都没有?
发个GET请求试试水
好嘞,装好了咱就来试试最基本的GET请求,你看啊,代码长这样:
import httpx
response = httpx.get("https://httpbin.org/get")
print(response.status_code)
print(response.text)
哎呀,是不是跟requests几乎一模一样?我第一次用的时候都惊了,这迁移成本也太低了吧!你要是之前写过requests的代码,基本上把requests换成httpx就完事儿了,省心得很。
异步请求才是重头戏!
好了好了,前面都是开胃菜,现在才是httpx真正的杀手锏——异步请求!我跟你说,这个功能是真的好用:
import httpx
import asyncio
async def fetch_data():
async with httpx.AsyncClient() as client:
response = await client.get("https://httpbin.org/get")
return response.json()
asyncio.run(fetch_data())
看到没?用AsyncClient配合async with,优雅得不行!我之前用其他库做异步请求的时候,那代码写得叫一个别扭……httpx这个设计真的是深得我心,而且注意啊,用AsyncClient的时候一定要记得用async with上下文管理器,不然连接池管理会出问题,这可是我踩过的坑,你们就别再踩了哈!
POST请求?小菜一碟
发POST请求也是顺手得很:
import httpx
data = {"name": "张三", "age": 25}
response = httpx.post("https://httpbin.org/post", json=data)
print(response.json())
传JSON就直接用json=参数,传表单就用data=参数,跟requests一模一样的用法,哦对了,httpx还支持传files=来上传文件,方便得很。
超时设置,这个必须重视!
说真的,超时设置这事儿千万不能忽略!我之前就因为没设超时,程序卡在那儿半天不动,差点以为电脑死机了……httpx设置超时特别简单:
import httpx
response = httpx.get("https://httpbin.org/get", timeout=10.0)
或者你想更精细地控制:
timeout = httpx.Timeout(10.0, connect=5.0)
response = httpx.get("https://httpbin.org/get", timeout=timeout)
看到没?连接超时和总超时可以分开设,灵活得很,我现在的习惯是每个请求都带上超时,真的,血泪教训啊朋友们!
自定义请求头?当然可以
有时候咱们需要加一些自定义的请求头,比如User-Agent、Authorization啥的:
headers = {
"User-Agent": "MyApp/1.0",
"Authorization": "Bearer your_token_here"
}
response = httpx.get("https://httpbin.org/headers", headers=headers)
这个也没啥好说的,跟requests一个套路,用过的人都知道。
客户端复用,性能优化的关键
哎,这里我要重点说一下!如果你要发多个请求,千万别每次都httpx.get(),那样每次都会创建新的连接,效率低得很,正确的做法是用Client:
import httpx
with httpx.Client() as client:
r1 = client.get("https://httpbin.org/get")
r2 = client.post("https://httpbin.org/post", json={"key": "value"})
用Client的好处是它会自动管理连接池,复用TCP连接,速度快很多,这个技巧在做爬虫或者频繁调API的时候特别管用,一定要记住啊!
错误处理也不能马虎
请求发出去,总有出错的时候嘛,httpx的错误处理也很清晰:
import httpx
try:
response = httpx.get("https://httpbin.org/get", timeout=5.0)
response.raise_for_status()
except httpx.HTTPStatusError as e:
print(f"HTTP错误:{e.response.status_code}")
except httpx.RequestError as e:
print(f"请求出错:{e}")
raise_for_status()会在4xx和5xx的时候抛出异常,配合try-except用起来特别顺手,说实话,良好的错误处理习惯真的能让你的代码健壮不少,别问我怎么知道的……
最后唠两句
好了,这篇httpx保姆级教程到这儿就差不多啦!httpx语法跟requests高度相似,学习成本低;支持同步和异步双模式,灵活度拉满;HTTP/2、连接池、超时控制这些该有的都有,不管你是做爬虫、调API还是写微服务,httpx都能帮你搞定。
真心建议大家试试这个库,用过之后你大概率会跟我一样,从此requests是路人哈哈哈!有什么问题欢迎评论区交流,咱们下篇文章见~