requests — самая популярная Python-библиотека в мире. Более 300 миллионов загрузок в месяц. Она делает HTTP-запросы простыми и читаемыми.
Установка
pip install requests
На CodeHS библиотека уже установлена.
Базовый GET-запрос
import requests
response = requests.get("https://api.chucknorris.io/jokes/random")
print(response.status_code) # 200
print(response.text) # сырой текст ответа
print(response.json()) # Python-словарь (если ответ — JSON)
Параметры запроса (params)
Параметры передаются словарём — requests сам соберёт правильный URL:
# Плохо — ручная сборка URL:
url = f"https://api.chucknorris.io/jokes/random?category={category}"
# Хорошо — через params=:
response = requests.get(
"https://api.chucknorris.io/jokes/random",
params={"category": "dev"}
)
# Итоговый URL: .../jokes/random?category=dev
Если в значении параметра есть спецсимволы (&, /, пробелы) — params= автоматически их экранирует. Ручная сборка в таком случае сломается.
timeout — всегда указывай
response = requests.get(url, timeout=10)
# Если сервер не ответил за 10 секунд — выбросит Timeout
Без timeout программа может зависнуть навсегда. В production-коде timeout обязателен.
response.json() vs response.text vs response.content
response = requests.get(url)
response.status_code # число: 200, 404, 401...
response.text # строка — сырой текст ответа
response.json() # Python-словарь/список (парсит JSON)
response.content # bytes — бинарные данные (изображения, файлы)
response.headers # словарь заголовков ответа
raise_for_status()
Автоматически выбрасывает HTTPError если статус >= 400:
response = requests.get(url)
response.raise_for_status() # ничего не делает при 200, падает при 4xx/5xx
data = response.json()
Удобнее чем if response.status_code != 200: raise ....
POST-запрос с телом
response = requests.post(
"https://api.github.com/user/repos",
headers={"Authorization": "Bearer TOKEN"},
json={"name": "my-repo", "private": False}, # тело запроса
)
json= автоматически:
- Сериализует словарь в JSON
- Добавляет заголовок Content-Type: application/json
PATCH и другие методы
requests.patch(url, headers=headers, json={"state": "closed"})
requests.delete(url, headers=headers)
requests.put(url, headers=headers, json={...})
# Или универсально:
requests.request("PATCH", url, headers=headers, json={...})
Заголовки (headers)
headers = {
"Authorization": "Bearer my_token",
"Accept": "application/json",
}
response = requests.get(url, headers=headers)
Обработка ошибок
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.ConnectionError:
print("Нет интернета")
except requests.exceptions.Timeout:
print("Сервер не ответил")
except requests.exceptions.HTTPError as e:
print(f"HTTP ошибка: {e.response.status_code}")
Скачивание файла
response = requests.get(image_url, timeout=30)
response.raise_for_status()
with open("photo.jpg", "wb") as f:
f.write(response.content) # content — bytes, не text
Итог
| Что делаешь | Как |
|---|---|
| GET-запрос | requests.get(url, params={}, timeout=10) |
| POST-запрос | requests.post(url, json={}, headers={}) |
| Статус ответа | response.status_code |
| JSON-данные | response.json() |
| Автопроверка статуса | response.raise_for_status() |
| Бинарные данные | response.content |
💬 Comments (0)
No comments yet
Be the first to share your opinion about this article!