异步时代的新选择:深入httpx的世界
Python的网络请求库太多了,requests库用得挺爽,可是一到异步场景就歇菜了。用aiohttp吧,写法又不太优雅。我找来找去,发现了个宝藏库 -httpx ,简直就是集大成者,同步异步都不在话下。
基本使用方法
httpx的语法跟requests基本一致,上手超级简单: import httpx
# 发送GET请求
response = httpx.get('https://api.github.com')
print(response.status_code) # 200
print(response.json()) # 返回JSON数据
还可以带上请求头和参数:
headers = {'User-Agent': 'python-httpx/0.24.0'}
params = {'q': 'python'}
response = httpx.get(
'https://api.github.com/search/repositories',
headers=headers,
params=params
)
温馨提示:记得检查响应状态码哦,别一股脑就去解析返回数据,万一请求失败了呢?
异步请求才是重头戏
要说httpx最牛的地方,那必须是异步请求。看看这代码多优雅: import asyncio
import httpx
async def fetch_data():
async with httpx.AsyncClient() as client:
response = await client.get('https://api.github.com')
return response.json()
# 运行异步函数
data = asyncio.run(fetch_data())
想发送多个并发请求?轻轻松松:
async def get_multiple_apis():
urls = [
'https://api.github.com/users/python',
'https://api.github.com/users/django',
'https://api.github.com/users/flask'
]
async with httpx.AsyncClient() as client:
tasks = [client.get(url) for url in urls]
responses = await asyncio.gather(*tasks)
return [r.json() for r in responses]
超时和重试机制
网络请求老出问题?httpx给你兜底: # 设置超时时间
client = httpx.Client(timeout=5.0)
# 使用重试机制
transport = httpx.HTTPTransport(retries=3)
client = httpx.Client(transport=transport)
温馨提示:异步客户端记得用完要关闭,最好用 async with 语法,省心又省力。
HTTP/2 支持
现在是2024年了,HTTP/2不会用说不过去吧: client = httpx.Client(http2=True)
response = client.get('https://nghttp2.org')
print(response.http_version) # HTTP/2
我还发现一个好玩的事,用HTTP/2发请求真的比HTTP/1.1快不少,特别是在并发请求多的时候。
请求中间件
想在每个请求里加点料?中间件安排上: class LoggingMiddleware:
async def __call__(self, request):
print(f“请求: {request.method} {request.url}”)
response = await request.send()
print(f“响应: {response.status_code}”)
return response
client = httpx.AsyncClient(middlewares=[LoggingMiddleware()])
讲真,用了httpx后,我都不想用别的HTTP库了。它把requests的简单好用和异步的高性能完美结合在一起,还加入了不少现代特性。对了,差点忘了说,它的文档写得也超级清晰。
把这些基础用法掌握了,基本上能应付大部分场景了。想要更高级的玩法,比如自定义传输层、复杂的认证方式,可以去翻翻官方文档,里面有不少好东西。