API в Python: работа с Requests, REST API и создание собственных API

API в Python: работа с Requests, REST API и создание собственных API

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.


   28.11.2025 10:00:22
Автор статьи:
Краснов Эрнест Маркович ©
ЕЩЕ ПО ТЕМЕ