httpx — HTTP-клиент нового поколения. Интерфейс похож на requests, но с поддержкой async/await из коробки.
Установка
uv add httpx
Базовые запросы
import httpx
# GET запрос
response = httpx.get("https://wttr.in/Moscow?format=j1", timeout=10)
response.raise_for_status() # бросает исключение при 4xx/5xx
data = response.json()
# GET с параметрами
response = httpx.get(
"https://api.example.com/search",
params={"q": "python", "limit": 10},
timeout=10
)
# POST с JSON
response = httpx.post(
"https://api.example.com/data",
json={"key": "value"},
headers={"Authorization": "Bearer token"},
timeout=10
)
timeout — всегда указывай
# Без timeout запрос может висеть вечно
response = httpx.get(url, timeout=10) # 10 секунд
response = httpx.get(url, timeout=None) # без ограничений (плохо)
# Раздельные таймауты
timeout = httpx.Timeout(connect=5.0, read=30.0)
response = httpx.get(url, timeout=timeout)
raise_for_status()
try:
response = httpx.get(url, timeout=10)
response.raise_for_status()
data = response.json()
except httpx.TimeoutException:
return "Ошибка: сервер не ответил за 10 секунд"
except httpx.HTTPStatusError as e:
return f"Ошибка {e.response.status_code}: {e.response.text}"
Переиспользование клиента (Client)
# Лучше создать клиент один раз для нескольких запросов
with httpx.Client(timeout=10, base_url="https://api.example.com") as client:
r1 = client.get("/users")
r2 = client.get("/posts")
Async клиент
import asyncio
import httpx
async def fetch(url: str) -> dict:
async with httpx.AsyncClient(timeout=10) as client:
response = await client.get(url)
response.raise_for_status()
return response.json()
# Параллельные запросы
async def fetch_all(urls: list[str]) -> list[dict]:
async with httpx.AsyncClient(timeout=10) as client:
tasks = [client.get(url) for url in urls]
responses = await asyncio.gather(*tasks)
return [r.json() for r in responses]
httpx vs requests
| requests | httpx | |
|---|---|---|
| Sync | ✅ | ✅ |
| Async | ❌ | ✅ |
| HTTP/2 | ❌ | ✅ |
| Типизация | частично | полная |
| API | одинаковое | одинаковое |
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!