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

Какие знаешь HTTP-запросы?

1.0 Junior🔥 51 комментариев
#Интеграции и API

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

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

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

HTTP Методы (запросы)

Понимание HTTP методов — критично для BA при проектировании API и интеграций. Вот мой практический разбор.

1. Основные HTTP методы (CRUD operations)

GET — Читать (Read)

  • Безопасный (не изменяет данные)
  • Идемпотентный (можно вызывать много раз, результат один и тот же)
  • Данные в URL (query parameters)
  • Кэшируется браузером
GET /api/users?filter=active — получить список активных пользователей
GET /api/users/123 — получить пользователя с id 123
GET /api/users/123/orders — получить заказы пользователя 123

POST — Создавать (Create)

  • Не безопасный (изменяет данные)
  • Не идемпотентный (каждый вызов создает новый ресурс)
  • Данные в body
  • Не кэшируется
POST /api/users — создать нового пользователя
  Body: {name: "John", email: "john@example.com"}
  Response: {id: 123, name: "John", created_at: "2025-03-26T10:00:00Z"}

POST /api/users/123/orders — создать заказ для пользователя 123
  Body: {items: [...]}
  Response: {id: 456, user_id: 123, status: "pending"}

PUT — Обновить полностью (Update)

  • Не безопасный (изменяет данные)
  • Идемпотентный (результат один и тот же несмотря на количество вызовов)
  • Обновляет ВСЕ поля ресурса
  • Данные в body
PUT /api/users/123 — обновить пользователя 123
  Body: {name: "Jane", email: "jane@example.com", phone: "+1234567890"}
  Результат: все поля обновлены (если какое-то поле не передано, оно обнулится)

PATCH — Обновить частично (Partial Update)

  • Не безопасный
  • Идемпотентный
  • Обновляет ТОЛЬКО переданные поля
  • Данные в body
PATCH /api/users/123 — обновить только name
  Body: {name: "Jane"}
  Результат: обновляется только name, остальные поля не трогаются

Разница PUT vs PATCH:

Исходный ресурс:
{
  "id": 123,
  "name": "John",
  "email": "john@example.com",
  "phone": "+1111111111"
}

Посланный body: {"name": "Jane"}

PUT результат:
{
  "id": 123,
  "name": "Jane",
  "email": null,  ← стёрлось!
  "phone": null   ← стёрлось!
}

PATCH результат:
{
  "id": 123,
  "name": "Jane",
  "email": "john@example.com",  ← не изменилось
  "phone": "+1111111111"         ← не изменилось
}

DELETE — Удалить (Delete)

  • Не безопасный (удаляет данные)
  • Идемпотентный (второй вызов вернет 404, но результат один — ресурса нет)
  • Данные в URL или body
DELETE /api/users/123 — удалить пользователя 123
  Response: 204 No Content (или 200 с сообщением)

DELETE /api/users/123/orders/456 — удалить заказ

2. Другие HTTP методы

HEAD — как GET, но без body в ответе

  • Проверить существует ли ресурс
  • Узнать метаданные (размер файла, дату изменения)
HEAD /api/users/123 — проверить существует ли пользователь
Response: 200 OK (но без body)

OPTIONS — узнать какие методы поддерживает endpoint

  • Используется браузером перед CORS запросом
  • Для человека редко нужно
OPTIONS /api/users — узнать какие методы поддерживает
Response:
Allow: GET, POST, PUT, DELETE, OPTIONS

3. Safe vs Idempotent

Safe методы (безопасные):

  • Не изменяют данные на сервере
  • GET, HEAD, OPTIONS
  • Можно вызывать много раз без побочных эффектов

Idempotent методы (идемпотентные):

  • Результат один и тот же независимо от количества вызовов
  • GET, HEAD, PUT, DELETE, OPTIONS
  • POST — НЕ идемпотентный (каждый вызов создает новый ресурс)
  • PATCH — может быть не идемпотентный (зависит от реализации)

Примеры:

GET /api/users/123 — результат всегда одинаковый (safe + idempotent)
POST /api/users — создает новый ресурс каждый раз (не safe, не idempotent)
DELETE /api/users/123 — второй вызов вернет 404, но тот же результат (не safe, идемпotent)
PUT /api/users/123 — обновляет на одни и те же значения (не safe, идемпотент)

Почему это важно для BA:

Если мы проектируем API и хотим retry logic:

  • GET можно переделать безопасно (вызвать много раз)
  • POST нужен Idempotency-Key (иначе дублирование)
  • DELETE безопасен для retry

4. HTTP Status Codes (коды ответов)

2xx Success (успех)

200 OK — обычный успешный ответ (GET, POST, PUT, PATCH, DELETE)
201 Created — ресурс успешно создан (POST)
202 Accepted — запрос принят, обработка асинхронно (POST для длительных операций)
204 No Content — успех, но нет body (DELETE, PATCH без ответа)

3xx Redirection (перенаправление)

301 Moved Permanently — ресурс перемещён навсегда (браузер обновляет ссылку)
302 Found — временное перенаправление
304 Not Modified — ресурс не изменился с момента кэша (браузер использует кэш)

4xx Client Error (ошибка клиента)

400 Bad Request — неправильный формат запроса (неправильный JSON)
401 Unauthorized — нет аутентификации (нужен token)
403 Forbidden — аутентифицирован, но нет прав (не разрешено удалять других пользователей)
404 Not Found — ресурс не существует
409 Conflict — конфликт (попытка обновить стареющие данные)
422 Unprocessable Entity — валидация данных не прошла (email не валидный)
429 Too Many Requests — слишком много запросов (rate limiting)

5xx Server Error (ошибка сервера)

500 Internal Server Error — ошибка на сервере (баг в коде)
502 Bad Gateway — сервер не доступен
503 Service Unavailable — сервер перегружен
504 Gateway Timeout — запрос занял слишком долго

5. Практические примеры

Пример 1: REST API для управления пользователями

GET /api/v1/users
  → Status: 200
  → Response: [{id: 1, name: "John"}, {id: 2, name: "Jane"}]

GET /api/v1/users/1
  → Status: 200
  → Response: {id: 1, name: "John", email: "john@example.com"}

GET /api/v1/users/999
  → Status: 404
  → Response: {error: "User not found"}

POST /api/v1/users
  → Body: {name: "Bob", email: "bob@example.com"}
  → Status: 201
  → Response: {id: 3, name: "Bob", email: "bob@example.com", created_at: "..."}

PUT /api/v1/users/1
  → Body: {name: "John Doe", email: "john.doe@example.com"}
  → Status: 200
  → Response: {id: 1, name: "John Doe", email: "john.doe@example.com"}

PATCH /api/v1/users/1
  → Body: {email: "newemail@example.com"}
  → Status: 200
  → Response: {id: 1, name: "John Doe", email: "newemail@example.com"}

DELETE /api/v1/users/1
  → Status: 204 No Content

Пример 2: Интеграция с платёжной системой

Получить доступные методы оплаты:
GET /api/v3/payment-methods
  → Status: 200
  → Response: [{id: "card", name: "Card"}, {id: "wallet", name: "Wallet"}]

Создать платёж:
POST /api/v3/payments
  → Body: {amount: 10000, currency: "RUB", payment_method: "card"}
  → Status: 201
  → Response: {id: "pay_123", status: "pending", confirmation_url: "..."}

Получить статус платежа:
GET /api/v3/payments/pay_123
  → Status: 200
  → Response: {id: "pay_123", status: "succeeded", amount: 10000}

Отменить платёж:
DELETE /api/v3/payments/pay_123
  → Status: 200
  → Response: {id: "pay_123", status: "cancelled"}

Пример 3: Rate Limiting и Retry

Запрашиваю слишком быстро:
GET /api/users (запрос #1000 за 1 минуту)
  → Status: 429 Too Many Requests
  → Response: {error: "Rate limit exceeded", retry_after: 60}
  → Headers: X-RateLimit-Limit: 100, X-RateLimit-Remaining: 0

Это значит: прекратить запросы, попробовать через 60 секунд.

6. Headers (заголовки HTTP)

Важные headers для BA:

Authorization: Bearer token_here
  → Аутентификация (передаём токен)

Content-Type: application/json
  → Говорим серверу что данные в JSON

Accept: application/json
  → Просим вернуть ответ в JSON

X-Request-ID: unique-id-123
  → Для трейсинга запроса (корреляция логов)

Idempotency-Key: unique-key-456
  → Для идемпотентности (не дублировать при retry)

X-Custom-Header: value
  → Кастомные headers (если нужны)

Cache-Control: max-age=3600
  → Кэширование (кэшировать на 3600 секунд)

Content-Length: 256
  → Размер body

User-Agent: MyApp/1.0
  → Информация о клиенте

7. Когда использовать какой метод

GET — когда...

  • Нужно получить данные
  • Читаем, не меняем
  • Примеры: список заказов, профиль пользователя, поиск

POST — когда...

  • Создаём новый ресурс
  • Запускаем действие (отправить письмо, начать процесс)
  • Примеры: создать заказ, залогиниться, загрузить файл

PUT — когда...

  • Обновляем весь ресурс полностью
  • Редко используется в реальных API
  • Примеры: обновить профиль целиком

PATCH — когда...

  • Обновляем ресурс частично
  • Чаще всего это PATCH, не PUT
  • Примеры: изменить только email, только status

DELETE — когда...

  • Удаляем ресурс
  • Примеры: удалить заказ, удалить аккаунт

8. Ошибки которые часто делают

Ошибка 1: GET для создания

❌ GET /api/users/create?name=John
✅ POST /api/users с body {name: "John"}

Ошибка 2: POST для обновления (без Idempotency-Key)

❌ POST /api/payments без Idempotency-Key (дублируется при retry)
✅ POST /api/payments с Idempotency-Key (retry безопасен)

Ошибка 3: PUT когда нужен PATCH

❌ PUT /api/users/123 {name: "Jane"} → остальные поля обнулятся
✅ PATCH /api/users/123 {name: "Jane"} → остальные поля не трогаются

Ошибка 4: Не использовать правильный статус код

❌ POST /api/users → Status: 200 (неправильно)
✅ POST /api/users → Status: 201 (правильно)

❌ DELETE /api/users/999 → Status: 500 (если не найден)
✅ DELETE /api/users/999 → Status: 404 (правильно)

9. REST API Design Best Practices

Правило 1: Используй существительные, не глаголы

❌ GET /api/getUsers
❌ POST /api/createUser
❌ PUT /api/updateUser/123
✅ GET /api/users
✅ POST /api/users
✅ PUT /api/users/123

Правило 2: Версионирование

✅ /api/v1/users
✅ /api/v2/users (если изменился формат)

Правило 3: Вложенные ресурсы

✅ GET /api/users/123/orders (заказы пользователя 123)
✅ GET /api/users/123/orders/456 (заказ 456 пользователя 123)

Правило 4: Фильтрация, сортировка, пагинация

✅ GET /api/users?filter=active&sort=name&limit=10&offset=0

Чек-лист для BA при проектировании API

  • ✅ Определены все endpoints
  • ✅ Для каждого endpoint указан метод (GET, POST, etc)
  • ✅ Определены параметры (обязательные, опциональные)
  • ✅ Определены возможные status codes
  • ✅ Определены примеры запроса и ответа
  • ✅ Задокументированы все ошибки
  • ✅ Определено rate limiting
  • ✅ Определена аутентификация и авторизация
  • ✅ Определено версионирование
  • ✅ Определены retry strategy (Idempotency-Key если нужно)

Итог

Понимание HTTP методов и кодов — базовый навык для BA. Это позволяет:

  • Правильно проектировать API
  • Общаться с разработчиками на одном языке
  • Документировать интеграции
  • Предвидеть проблемы
Какие знаешь HTTP-запросы? | PrepBro