API в Python — одна из самых распространенных задач. Вот подробное руководство по основным аспектам.
1. Основные библиотеки
requests (самая популярная)
import requests
import json
# Установка: pip install requests
httpx (современная альтернатива)
python
import httpx
# Установка: pip install httpx
2. Базовые HTTP-запросы
GET-запрос
python
import requests
# Простой GET-запрос
response = requests.get('https://api.example.com/users')
print(response.status_code) # Код статуса
print(response.json()) # JSON ответ
print(response.text) # Текст ответа
# С параметрами
params = {'page': 1, 'limit': 10}
response = requests.get('https://api.example.com/users', params=params)
POST-запрос
python
# С JSON данными
data = {'name': 'John', 'email': 'john@example.com'}
response = requests.post('https://api.example.com/users', json=data)
# С form-data
data = {'name': 'John', 'email': 'john@example.com'}
response = requests.post('https://api.example.com/users', data=data)
# С файлами
files = {'file': open('image.jpg', 'rb')}
response = requests.post('https://api.example.com/upload', files=files)
PUT, PATCH, DELETE
python
# PUT - полное обновление
response = requests.put('https://api.example.com/users/1', json=data)
# PATCH - частичное обновление
response = requests.patch('https://api.example.com/users/1', json=data)
# DELETE - удаление
response = requests.delete('https://api.example.com/users/1')
3. Работа с заголовками и аутентификацией
Заголовки
python
headers = {
'Content-Type': 'application/json',
'User-Agent': 'MyApp/1.0',
'Authorization': 'Bearer your_token_here'
}
response = requests.get('https://api.example.com/data', headers=headers)
Аутентификация
python
# Basic Auth
from requests.auth import HTTPBasicAuth
response = requests.get(
'https://api.example.com/protected',
auth=HTTPBasicAuth('username', 'password')
)
# Или проще
response = requests.get(
'https://api.example.com/protected',
auth=('username', 'password')
)
# Bearer Token
headers = {'Authorization': 'Bearer your_token_here'}
response = requests.get('https://api.example.com/data', headers=headers)
# API Key в параметрах
params = {'api_key': 'your_api_key'}
response = requests.get('https://api.example.com/data', params=params)
4. Обработка ответов
python
response = requests.get('https://api.example.com/data')
# Проверка статуса
if response.status_code == 200:
data = response.json()
print("Успешно:", data)
elif response.status_code == 404:
print("Ресурс не найден")
else:
print(f"Ошибка: {response.status_code}")
# Или с использованием raise_for_status()
try:
response.raise_for_status() # Вызывает исключение для 4xx/5xx статусов
data = response.json()
except requests.exceptions.HTTPError as err:
print(f"HTTP ошибка: {err}")
except requests.exceptions.RequestException as err:
print(f"Ошибка запроса: {err}")
5. Работа с сессиями
python
# Создание сессии для повторного использования соединений
with requests.Session() as session:
session.headers.update({
'User-Agent': 'MyApp/1.0',
'Authorization': 'Bearer token123'
})
# Все запросы в сессии используют общие настройки
response1 = session.get('https://api.example.com/users')
response2 = session.post('https://api.example.com/data', json={'key': 'value'})
6. Таймауты и обработка ошибок
python
try:
# Таймаут на подключение и чтение (в секундах)
response = requests.get(
'https://api.example.com/data',
timeout=(3.05, 10) # (connect_timeout, read_timeout)
)
except requests.exceptions.Timeout:
print("Превышено время ожидания")
except requests.exceptions.ConnectionError:
print("Ошибка подключения")
except requests.exceptions.RequestException as e:
print(f"Общая ошибка: {e}")
7. Практический пример: работа с JSONPlaceholder API
python
import requests
import json
class JSONPlaceholderAPI:
def __init__(self, base_url='https://jsonplaceholder.typicode.com'):
self.base_url = base_url
self.session = requests.Session()
self.session.headers.update({'Content-Type': 'application/json'})
def get_users(self):
response = self.session.get(f'{self.base_url}/users')
response.raise_for_status()
return response.json()
def get_user_posts(self, user_id):
response = self.session.get(f'{self.base_url}/users/{user_id}/posts')
response.raise_for_status()
return response.json()
def create_post(self, title, body, user_id):
data = {
'title': title,
'body': body,
'userId': user_id
}
response = self.session.post(f'{self.base_url}/posts', json=data)
response.raise_for_status()
return response.json()
# Использование
api = JSONPlaceholderAPI()
try:
# Получить всех пользователей
users = api.get_users()
print(f"Найдено пользователей: {len(users)}")
# Получить посты первого пользователя
posts = api.get_user_posts(1)
print(f"Первый пользователь имеет {len(posts)} постов")
# Создать новый пост
new_post = api.create_post(
title='Мой пост',
body='Содержание поста',
user_id=1
)
print(f"Создан пост с ID: {new_post['id']}")
except requests.exceptions.RequestException as e:
print(f"Ошибка API: {e}")
8. Асинхронные запросы с httpx
python
import httpx
import asyncio
async def fetch_data():
async with httpx.AsyncClient() as client:
response = await client.get('https://api.example.com/data')
return response.json()
# Использование
# data = asyncio.run(fetch_data())
9. Полезные советы
1. Всегда используйте таймауты
2. Обрабатывайте исключения
3. Используйте сессии для множественных запросов
4. Проверяйте статус ответа
5. Логируйте запросы для отладки
6. Уважайте rate limits API
7. Используйте виртуальные окружения для изоляции зависимостей
10. Установка зависимостей
bash
pip install requests httpx
Начните с библиотеки requests — она проста в использовании и имеет отличную документацию. Для более сложных сценариев или асинхронного программирования рассмотрите httpx.