1、简介
aiohttp 是基于 asyncio 的异步 HTTP 客户端/服务器框架,用于构建高性能、高并发的网络应用程序。
ps:我就是用来配合asyncio构建HTTP请求的。因为requests不支持asyncio,也就是同步的。
2、aiohttp.request()
特点:
- aiohttp中最基本的API
- 不支持HTTP Keep-alive
- 由于每次都是新建立连接,而不是重用连接,所以不适合执行大量HTTP请求
主要参数说明:
async def aiohttp.request(method, url, *, params=None, data=None, json=None, headers=None, cookies=None, auth=None, timeout=None, allow_redirects=True, ssl=None, proxy=None, proxy_auth=None, loop=None, **kwargs)
method
: 请求方法,例如 'GET', 'POST' 等。url
: 请求的目标 URL。params
: 查询参数,可以是字典或字符串形式。如果是字典形式,会自动将参数转换为 URL 查询字符串并附加到 URL 后面。data
: 请求的数据,可以是字符串或字节流。通常用于 POST 请求的表单数据。json
: 请求的 JSON 数据,用于发送 JSON 格式的数据。headers
: 请求头部信息,可以是字典形式。cookies
: 请求的 Cookie,可以是字典形式。auth
: 请求的身份验证信息,例如 HTTPBasicAuth。timeout
: 请求的超时时间,可以是数字或aiohttp.ClientTimeout
对象。
基本使用:
import asyncio
import aiohttp
async def main():
get_cookies_url = 'http://httpbin.org/cookies'
async with aiohttp.request('GET', get_cookies_url) as resp2:
print(await resp2.text())
asyncio.run(main())
3、Response object
如同requests,当用aiohttp发出一个请求后,会收到一个ClientResponse
对象,它表示 HTTP
响应。这个对象包含了从服务器返回的所有信息,例如响应状态码、响应头、响应体等。
- 状态码和状态信息 :
- 你可以使用
status
属性来获取 HTTP 响应的状态码,例如response.status
。 - 使用
reason
属性来获取状态码对应的状态信息,例如response.reason
。
- 你可以使用
- 头部信息 :
- HTTP 响应的头部信息可以通过
headers
属性来获取,它是一个字典类型,包含了所有的响应头。 - 你可以通过键名来访问特定的响应头,例如
response.headers['Content-Type']
。
- HTTP 响应的头部信息可以通过
- 响应体 :
- HTTP 响应的内容存储在响应体中,你可以使用
read()
、json()
或text()
方法来获取响应体的内容。 read()
: 以字节流的形式读取响应体的内容。json()
: 将响应体解析为 JSON 格式。text()
: 以字符串的形式读取响应体的内容。
- HTTP 响应的内容存储在响应体中,你可以使用
- 其他属性 :
url
: 获取请求的 URL。content_type
: 获取响应的内容类型。content_length
: 获取响应体的长度。- 等等。
注意:
- 从响应体取数据时使用
await resp.json()
。不要离开 async with 作用域,否则会报错。
4、ClientSession
ClientSession
是 aiohttp 中用于管理 HTTP 客户端会话的对象。它提供了一个上下文管理器,用于创建和管理异步 HTTP
请求,包括发送请求、处理响应以及管理连接池等。
- 创建会话对象 :
- 要创建一个
ClientSession
对象,你可以使用aiohttp.ClientSession()
来实例化它。通常情况下,你会在异步上下文中创建会话对象,以确保资源正确释放。
- 要创建一个
- 发送请求 :
- 一旦你创建了
ClientSession
对象,你就可以使用它来发送 HTTP 请求。会话对象提供了一系列方法,如get()
、post()
、put()
、delete()
等,用于发送不同类型的请求。
- 一旦你创建了
- 上下文管理器 :
ClientSession
对象可以作为上下文管理器使用,使用async with
语句来自动管理请求的生命周期。这样可以确保在请求完成后正确关闭和释放资源。
- 连接池管理 :
ClientSession
对象内部维护了一个连接池,用于管理与服务器的连接。默认情况下,会话对象会自动维护连接池,复用已建立的连接,提高性能和效率
基本使用:
import asyncio
import aiohttp
async def main():
set_cookies_url = 'http://httpbin.org/cookies/set?freeform=freedom'
get_cookies_url = 'http://httpbin.org/cookies'
async with aiohttp.ClientSession() as session:
async with session.get(set_cookies_url, allow_redirects=False) as resp1:
print('set cookies =>', resp1.cookies)
async with session.get(get_cookies_url) as resp2:
print('get cookies =>', await resp2.text())
asyncio.run(main())
get:
import aiohttp
import asyncio
async def fetch_data():
url = 'https://jsonplaceholder.typicode.com/posts/1'
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
data = await response.text()
print("Response:", data)
asyncio.run(fetch_data())
post:
import aiohttp
import asyncio
async def send_post_request():
url = 'https://jsonplaceholder.typicode.com/posts'
payload = {'title': 'foo', 'body': 'bar', 'userId': 1}
async with aiohttp.ClientSession() as session:
async with session.post(url, json=payload) as response:
data = await response.json()
print("Response:", data)
asyncio.run(send_post_request())
评论列表,共 0 条评论
暂无评论