python 利用aiohttp编写异步网络请求

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 响应。这个对象包含了从服务器返回的所有信息,例如响应状态码、响应头、响应体等。

  1. 状态码和状态信息 :
    • 你可以使用 status 属性来获取 HTTP 响应的状态码,例如 response.status
    • 使用 reason 属性来获取状态码对应的状态信息,例如 response.reason
  2. 头部信息 :
    • HTTP 响应的头部信息可以通过 headers 属性来获取,它是一个字典类型,包含了所有的响应头。
    • 你可以通过键名来访问特定的响应头,例如 response.headers['Content-Type']
  3. 响应体 :
    • HTTP 响应的内容存储在响应体中,你可以使用 read()json()text() 方法来获取响应体的内容。
    • read(): 以字节流的形式读取响应体的内容。
    • json(): 将响应体解析为 JSON 格式。
    • text(): 以字符串的形式读取响应体的内容。
  4. 其他属性 :
    • url: 获取请求的 URL。
    • content_type: 获取响应的内容类型。
    • content_length: 获取响应体的长度。
    • 等等。

注意:

  • 从响应体取数据时使用await resp.json()。不要离开 async with 作用域,否则会报错。

4、ClientSession

ClientSession 是 aiohttp 中用于管理 HTTP 客户端会话的对象。它提供了一个上下文管理器,用于创建和管理异步 HTTP 请求,包括发送请求、处理响应以及管理连接池等。

  1. 创建会话对象 :
    • 要创建一个 ClientSession 对象,你可以使用 aiohttp.ClientSession() 来实例化它。通常情况下,你会在异步上下文中创建会话对象,以确保资源正确释放。
  2. 发送请求 :
    • 一旦你创建了 ClientSession 对象,你就可以使用它来发送 HTTP 请求。会话对象提供了一系列方法,如 get()post()put()delete() 等,用于发送不同类型的请求。
  3. 上下文管理器 :
    • ClientSession 对象可以作为上下文管理器使用,使用 async with 语句来自动管理请求的生命周期。这样可以确保在请求完成后正确关闭和释放资源。
  4. 连接池管理 :
    • 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 条评论

    暂无评论