Комментарии (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 |
Лучшие практики
- Используй правильный метод для операции
- Обрабатывай ошибки с помощью try-except
- Используй sessions для нескольких запросов (переиспользование соединения)
- Проверяй статус-коды ответов
- Валидируй входные данные перед отправкой
Вот основные виды HTTP запросов!