urllib.request

標準ライブラリに含まれている。

import urllib.request

resp = urllib.request.urlopen("http://example.com")

return type(resp)
<class 'http.client.HTTPResponse'>

requests

ほぼデファクトとなっている。ただし非同期IOには対応していない。

import requests

resp = requests.get("http://example.com")

return type(resp)
<class 'requests.models.Response'>

aiohttp

https://docs.aiohttp.org/

非同期IO用のHTTPライブラリ。 サーバーとクライアントの両方を提供している。

import asyncio
import aiohttp.client

async def main():
    async with aiohttp.ClientSession() as client:
        return await client.get("http://example.com")

return type(asyncio.run(main()))
<class 'aiohttp.client_reqrep.ClientResponse'>

TODO trace_configオプションを有効にする

SCHEDULED: <2022-08-16 Tue>

CLOCK: [2022-08-16 Tue 18:19]–[2022-08-16 Tue 21:10] => 2:51

リクエストの送信ログを取得する方法としてtrace_configsオプションを提供している。 ここではその挙動を確認する。

import asyncio
from aiohttp import ClientSession, TraceConfig


async def on_request_end(session, trace_config_ctx, params):
    print(session, trace_config_ctx, params)

default_trace_config = TraceConfig()
default_trace_config.on_request_end.append(on_request_end)


async def main():
    async with ClientSession(trace_configs=[default_trace_config]) as client:
        resp = await client.get("http://example.com")
        print(resp)

asyncio.run(main())

httpx

同期および非同期IOの両方をサポートしている こちらはクライアントの両方を提供している。 同期および非同期IOの両方で似たような記述ができることをコンセプトにしている。

import asyncio
import httpx

async def main():
    async with httpx.AsyncClient() as client:
        return await client.get('http://example.com')

return type(asyncio.run(main()))
<class 'httpx.Response'>