Коды статуса
HTTP-коды статуса — это трехзначные числа, которые сервер отправляет клиенту, чтобы сообщить результат обработки запроса. Это как "статус доставки" в службе доставки:
- 200 — "Заказ доставлен успешно!"
- 404 — "Адрес не найден"
- 500 — "На складе проблемы"
Классификация по первым цифрам
1xx — Информационные (Informational)
"Я получил твой запрос, продолжаю работать..."
| Код | Название | Значение |
|---|---|---|
| 100 | Continue | "Продолжай, я готов принять тело запроса" |
| 101 | Switching Protocols | "Переключаю протокол" (HTTP → WebSocket) |
| 102 | Processing | "Обрабатываю, жди" (для долгих операций) |
| 103 | Early Hints | "Вот предварительные данные" |
Пример из жизни: Клиент отправляет большой файл. Сервер: "100 Continue" → "OK, отправляй дальше!"
2xx — Успех (Success)
"Всё прошло отлично, держи что хотел!"
| Код | Название | Когда использовать |
|---|---|---|
| 200 | ✅ OK | Стандартный ответ на успешные GET, POST, PUT |
| 201 | ✅ Created | Ресурс успешно создан (после POST) |
| 202 | ✅ Accepted | "Принял в обработку" (асинхронные задачи) |
| 204 | ✅ No Content | Успешно, но без тела ответа (удаление) |
| 206 | ✅ Partial Content | Частичный контент (для потоковой передачи) |
Примеры:
http
200 — Получил данные пользователя
HTTP/1.1 200 OK Content-Type: application/json {"id": 1, "name": "John"}
201 — Создал новый заказ
HTTP/1.1 201 Created Location: /api/orders/123 # Где найти новый ресурс
204 — Удалил успешно (тела нет)
HTTP/1.1 204 No Content
3xx — Перенаправление (Redirection)
"Ищи не здесь, а там..."
| Код | Название | Постоянность | Сохраняет метод? |
|---|---|---|---|
| 301 | Moved Permanently | Навсегда | Обычно GET |
| 302 | Found | Временно | GET |
| 303 | See Other | — | Всегда GET |
| 307 | Temporary Redirect | Временно | Сохраняет |
| 308 | Permanent Redirect | Навсегда | Сохраняет |
Разница 301 vs 308:
301 — "Страница переехала навсегда, поисковики обновляют ссылки"
308 — "Переехала навсегда, И метод запроса сохрани (POST останется POST)"
Пример:
http HTTP/1.1 301 Moved Permanently Location: https://new-site.com/page
4xx — Ошибка клиента (Client Error)
"Ты что-то неправильно сделал..."
| Код | Название | Причина |
|---|---|---|
| 400 | ❌ Bad Request | "Не могу понять твой запрос" (синтаксис) |
| 401 | ❌ Unauthorized | "Представься сначала" (нет аутентификации) |
| 403 | ❌ Forbidden | "Я тебя знаю, но не пущу" (нет прав) |
| 404 | ❌ Not Found | "Здесь ничего нет" |
| 405 | ❌ Method Not Allowed | "GET можно, а POST — нет" |
| 408 | ❌ Request Timeout | "Слишком долго думал, что отправить" |
| 409 | ❌ Conflict | "Конфликт данных" (дубликат email) |
| 429 | ❌ Too Many Requests | "Слишком много запросов, успокойся" |
Важные различия
401 vs 403
- 401 — "Кто ты?" (нет токена)
- 403 — "Я знаю кто ты, но доступ закрыт"
400 vs 422
- 400 — "Твой JSON сломан"
- 422 — "JSON ок, но логика нарушена" (например, отрицательная цена)
Пример 404
- http
- HTTP/1.1 404 Not Found
- Content-Type: text/html
5xx — Ошибка сервера (Server Error)
"У меня проблемы, это не твоя вина..."
| Код | Название | Причина |
|---|---|---|
| 500 | 🔥 Internal Server Error | "Что-то пошло не так" (общая ошибка) |
| 501 | 🔥 Not Implemented | "Такой метод не поддерживаю" |
| 502 | 🔥 Bad Gateway | "Прокси получил фигню от другого сервера" |
| 503 | 🔥 Service Unavailable | "На обслуживании, зайдите позже" |
| 504 | 🔥 Gateway Timeout | "Прокси долго ждал ответа" |
Разница 502 vs 504:
- 502 — "Соседний сервер ответил ерундой"
- 504 — "Соседний сервер вообще не ответил"
Примеры
В SEO
- 301 — передает "SEO-силу" на новую страницу
- 404 — говорит поисковикам "не индексируй"
- 503 — "временно не работаю, но скоро вернусь"
🛠️ Как правильно выбирать код? Чек-лист для разработчика:
Успешные операции
- Данные получены → 200
- Создал новый ресурс → 201 + заголовок Location
- Удалил/обновил без ответа → 204
Ошибки клиента
- Неправильный запрос → 400
- Нет авторизации → 401
- Нет прав → 403
- Не существует → 404
- Слишком частые запросы → 429
Ошибки сервера
- Непонятная ошибка → 500
- База данных упала → 503
- Завис внешний сервис → 502
Антипаттерны
- ❌ Всегда возвращать 200, даже при ошибках
- ❌ Возвращать 500 при ошибке валидации
- ❌ Использовать 302 для постоянных редиректов
- ❌ Возвращать 404 когда нужно 403 (раскрываем структуру)