← Назад к вопросам

Каки знаешь виды запросов

1.3 Junior🔥 221 комментариев
#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Виды HTTP запросов (методы)

В HTTP есть несколько методов запроса (verbs). Каждый имеет своё назначение. Расскажу о самых важных и как они используются в API.

1. GET — Получение данных

Назначение: Безопасно получить данные с сервера. GET не должен менять состояние.

import requests

# Простой GET
response = requests.get('https://api.example.com/users')
print(response.json())

# GET с параметрами
response = requests.get('https://api.example.com/users', params={
    'page': 1,
    'limit': 10,
    'sort': 'created_at'
})

# GET с заголовками
response = requests.get(
    'https://api.example.com/users',
    headers={'Authorization': 'Bearer token123'}
)

Характеристики:

  • Безопасный (не меняет данные)
  • Кэшируемый (браузер может кэшировать)
  • Идемпотентный (результат один и тот же независимо от количества вызовов)

2. POST — Создание новых ресурсов

Назначение: Создать новый ресурс на сервере.

# POST с JSON телом
response = requests.post(
    'https://api.example.com/users',
    json={
        'name': 'John Doe',
        'email': 'john@example.com',
        'age': 30
    }
)
print(response.status_code)  # 201 Created
print(response.json())

# POST с загрузкой файлов
with open('avatar.jpg', 'rb') as f:
    files = {'avatar': f}
    data = {'name': 'John'}
    response = requests.post(
        'https://api.example.com/users/upload',
        files=files,
        data=data
    )

Характеристики:

  • Создаёт новый ресурс
  • Обычно возвращает 201 Created или 200 OK
  • Не идемпотентный (каждый вызов создаёт новый ресурс)

3. PUT — Полное обновление ресурса

Назначение: Заменить весь ресурс новыми данными.

# PUT — полная замена
response = requests.put(
    'https://api.example.com/users/123',
    json={
        'name': 'Jane Doe',
        'email': 'jane@example.com',
        'age': 25
    }
)
print(response.status_code)  # 200 OK

Характеристики:

  • Идемпотентный (несколько PUT с теми же данными = один результат)
  • Требует полный объект
  • Обычно возвращает 200 OK

4. PATCH — Частичное обновление

Назначение: Обновить только часть ресурса.

# PATCH — частичное обновление
response = requests.patch(
    'https://api.example.com/users/123',
    json={
        'age': 26
    }
)
print(response.status_code)  # 200 OK

Характеристики:

  • Может быть идемпотентный или нет
  • Требует только изменённые поля
  • Обычно возвращает 200 OK

5. DELETE — Удаление ресурса

Назначение: Удалить ресурс.

# DELETE
response = requests.delete('https://api.example.com/users/123')
print(response.status_code)  # 204 No Content или 200 OK

# DELETE с авторизацией
response = requests.delete(
    'https://api.example.com/users/123',
    headers={'Authorization': 'Bearer admin-token'}
)

Характеристики:

  • Идемпотентный
  • Обычно возвращает 204 No Content
  • Опасный — нужна авторизация

6. HEAD — GET без тела ответа

Назначение: Получить только заголовки, без тела.

# HEAD — проверить существование ресурса
response = requests.head('https://api.example.com/users/123')
print(response.status_code)  # 200 OK
print(response.headers)  # Заголовки есть
print(response.content)  # Тело пусто

7. OPTIONS — Получить доступные методы

Назначение: Узнать, какие методы поддерживает ресурс.

# OPTIONS
response = requests.options('https://api.example.com/users/123')
print(response.headers.get('Allow'))  # GET, POST, PUT, DELETE

Статус-коды ответов

# Успешные (2xx)
200  # OK
201  # Created (обычно после POST)
204  # No Content (нет тела ответа)

# Ошибки клиента (4xx)
400  # Bad Request
401  # Unauthorized
403  # Forbidden
404  # Not Found
409  # Conflict
422  # Unprocessable Entity
429  # Too Many Requests (rate limit)

# Ошибки сервера (5xx)
500  # Internal Server Error
502  # Bad Gateway
503  # Service Unavailable

Пример REST API

import requests
from typing import Dict, Any

BASE_URL = 'https://api.example.com'
HEADERS = {'Authorization': 'Bearer token123'}

class APIClient:
    def get_users(self):
        response = requests.get(f'{BASE_URL}/users', headers=HEADERS)
        response.raise_for_status()
        return response.json()
    
    def get_user(self, user_id: int):
        response = requests.get(f'{BASE_URL}/users/{user_id}', headers=HEADERS)
        response.raise_for_status()
        return response.json()
    
    def create_user(self, name: str, email: str):
        response = requests.post(
            f'{BASE_URL}/users',
            json={'name': name, 'email': email},
            headers=HEADERS
        )
        response.raise_for_status()
        return response.json()
    
    def update_user(self, user_id: int, **kwargs):
        response = requests.patch(
            f'{BASE_URL}/users/{user_id}',
            json=kwargs,
            headers=HEADERS
        )
        response.raise_for_status()
        return response.json()
    
    def delete_user(self, user_id: int):
        response = requests.delete(
            f'{BASE_URL}/users/{user_id}',
            headers=HEADERS
        )
        response.raise_for_status()
        return response.status_code == 204

# Использование
client = APIClient()
users = client.get_users()
new_user = client.create_user('John', 'john@example.com')
user_id = new_user['id']
client.update_user(user_id, age=30)
client.delete_user(user_id)

Таблица методов

МетодИспользованиеБезопасныйИдемпотентныйСтатус
GETПолучениеДаДа200
POSTСозданиеНетНет201
PUTПолное обновлениеНетДа200
PATCHЧастичное обновлениеНет?200
DELETEУдалениеНетДа204
HEADПроверка заголовковДаДа200
OPTIONSДоступные методыДаДа200

Лучшие практики

  1. Используй правильный метод для операции
  2. Обрабатывай ошибки с помощью try-except
  3. Используй sessions для нескольких запросов (переиспользование соединения)
  4. Проверяй статус-коды ответов
  5. Валидируй входные данные перед отправкой

Вот основные виды HTTP запросов!