前言
在 Python 众多的 HTTP 客户端中,最有名的莫过于requests
、aiohttp
和httpx
。
在不借助其他第三方库的情况下,requests
只能发送同步请求;aiohttp
只能发送异步请求;httpx
既能发送同步请求,又能发送异步请求。
那么怎么选择呢
- 只发同步请求用
requests
,但可配合多线程变异步。 - 只发异步请求用
aiohttp
,但可以配合await变同步。 httpx
可以发同步请求也可以异步,但是请求速度同步略差于requests
,异步略差于aiohttp
这里不建议使用多线程来做异步请求,建议使用异步IO的方式。
httpx
的特点:
- 功能强大,既能同步也能异步。
- 同步请求和requests的语法基本一致,方便代码迁移。
- 性能虽然差点,但是差的不多可以忽略。
同步请求
GET请求
1 | import httpx |
结果
1 | r.text: {"code":0,"msg":"success","obj":{"name":"小明","sex":"男","token":"psvmc"}} |
判断返回状态码
1 | r.status_code == httpx.codes.OK |
POST请求
基本请求
1 | r = httpx.post('https://www.psvmc.cn/login.json', data={'key':'value'}) |
文件上传
1 | files ={'upload-file': open('report.xls','rb')} |
文件和数据
1 | data = {'message': 'Hello, world!'} |
二进制数据
1 | content = b'Hello World' |
其它请求
1 | r = httpx.put('https://www.psvmc.cn/login.json', data={'key':'value'}) |
设置超时时间
1 | import httpx |
SSL
1 | response = httpx.get('https://example.org', verify='../../client.pem') |
又或者,你可以将verify
设置为False禁用SSL验证:
1 | response = httpx.get('https://example.org', verify=False) |
自定义Header
1 | headers ={'user-agent':'psvmc/0.0.1'} |
认证方式
HTTPX支持基本和摘要HTTP身份验证。
要提供基本身份验证凭据,请将2个元组的纯文本 str或 bytes对象作为 auth参数传递给请求函数:
1 | import httpx |
要提供摘要式身份验证的凭据,您需要 DigestAuth使用纯文本用户名和密码作为参数实例化一个对象。然后可以将该对象作为 auth参数传递给上述请求方法:
1 | import httpx |
异步请求
1 | import httpx |
响应
常用的响应
1 | print("r.text:", r.text) |
流响应
对于大型下载,您可能需要使用不将整个响应主体立即加载到内存中的流式响应。
您可以流式传输响应的二进制内容…
1 | import httpx |
或回应文字
1 | import httpx |
或逐行流文本
1 | import httpx |
HTTPX将使用通用行结尾,将所有情况标准化为 \n
。
在某些情况下,您可能希望在不应用任何HTTP内容解码的情况下访问响应上的原始字节。在这种情况下的任何内容编码web服务器已诸如施加 gzip
, deflate
或 brotli
将不会自动解码。
1 | import httpx |
如果您以上述任何一种方式使用流式响应,则 response.content
and response.text
属性将不可用,并且如果访问将引发错误。但是,您还可以使用响应流功能来有条件地加载响应主体:
1 | import httpx |
二进制加载为图片
1 | from PIL import Image |