在 Python 众多的 HTTP 客户端中,最有名的莫过于 requests
、 aiohttp
和 httpx
。
在不借助其他第三方库的情况下, requests
只能发送同步请求; aiohttp
只能发送异步请求; httpx
既能发送同步请求,又能发送异步请求。
那么怎么选择呢
- 只发同步请求用
requests
,但可配合多线程变异步。 - 只发异步请求用
aiohttp
,但可以配合await变同步。 httpx
可以发同步请求也可以异步,但是请求速度同步略差于requests
,异步略差于aiohttp
Asyncio 的强大。但是,任何一种方案都不是完美的,都存在一定的局限性,Asyncio 同样如此。
实际使用中,想用好 Asyncio,特别是发挥其强大的功能,很多情况下必须得有相应的 Python 库支持。
比如
requests 库并不兼容 Asyncio,而 aiohttp 库兼容。
requests
这里先说 requests
安装依赖
pip install requests
响应
响应的类型
#获取接口返回的字符串数据
r.text
#获取接口返回的json数据,即直接将json格式的数据转换为json对象
r.json()
#获取接口返回的二进制数据,假设二进制数据如果为图片可以继续转换成图片
r.content
#获取原始套接字,使用r.raw请在 requests 请求中加上参数 stream=True
r.raw
获取请求响应的其他信息
#获取状态码
r.status_code
#获取请求的url
r.url
#获取指定cookies信息
r.cookies['token']
#获取访问服务器返回给我们的响应头部信息
r.headers
#获取指定访问服务器返回给我们的响应头部信息
r.headers['Content-Type']
#获取发送到服务器的请求的头部的信息
r.request.headers
请求
GET请求
get请求:
res = requests.get(url,data=data,cookies=cookie,headers=header,verify=False,files=file)
data可传可不传,data是字典格式。
如果url是https的话,加上verify=False。如果url是http的话,可不加。
示例1
import requests
if __name__ == '__main__':
r = requests.get("https://www.psvmc.cn")
print(r.text)
示例2
import requests
if __name__ == '__main__':
data = {'username': 'admin', 'passwd': '123456'}
r = requests.get("https://www.psvmc.cn/login.json", params=data)
print(r.status_code)
print(r.json()["obj"])
POST请求
url_post = "https://www.psvmc.cn/login.json"
#不包含任何参数的请求
r = requests.post(url_post)
#不包含任何参数的请求,设置超时10s,timeout不设置则默认60s
r = requests.post(url_post,timeout=10)
#携带参数的请求,dict_param为参数字典,默认data=dict_param,使用data=则表示post的是form请求
#即 application/x-www-form-urlencoded 。
r = requests.post(url_post, data=