Какие HTTP-коды ответов вы знаете? Что означают коды 200, 201, 400, 401, 403, 404, 500?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
HTTP коды ответов и их значения
HTTP статус коды — это трехзначные числа, которые сервер отправляет клиенту в ответ на HTTP запрос. Они сообщают о результате попытки выполнить запрос: успех, ошибка клиента, ошибка сервера и так далее.
Классификация HTTP кодов
Все статус коды разделены на 5 категорий в зависимости от первой цифры:
1xx (100-199) — Informational (Информационные)
- Промежуточные ответы
- Запрос получен и обрабатывается
2xx (200-299) — Success (Успешно)
- Запрос успешно выполнен
- Клиент получил желаемый результат
3xx (300-399) — Redirection (Перенаправление)
- Требуется дополнительное действие для выполнения запроса
- Обычно редирект на другой URL
4xx (400-499) — Client Error (Ошибка клиента)
- Запрос содержит ошибку
- Клиент виноват в проблеме
5xx (500-599) — Server Error (Ошибка сервера)
- Сервер не может выполнить корректный запрос
- Сервер виноват в проблеме
Детальный разбор основных кодов
2xx — Успешные коды
200 OK
Значение: Запрос выполнен успешно, ответ содержит желаемые данные
Когда использовать:
- GET запрос успешно выполнен
- PUT запрос успешно обновил ресурс
- DELETE запрос успешно удалил ресурс (иногда)
- Любой успешный запрос
Пример:
Запрос: GET /api/users/123
Ответ: 200 OK
Тело: {
"id": 123,
"name": "John",
"email": "john@example.com"
}
201 Created
Значение: Ресурс успешно создан, новый ресурс находится в теле ответа или в заголовке Location
Когда использовать:
- POST запрос создал новый ресурс
- Необходимо вернуть в Location адрес нового ресурса
Пример:
Запрос: POST /api/users
Тело: {"name": "Alice", "email": "alice@example.com"}
Ответ: 201 Created
Location: /api/users/124
Тело: {
"id": 124,
"name": "Alice",
"email": "alice@example.com",
"created_at": "2024-03-29T10:00:00Z"
}
202 Accepted
Значение: Запрос принят, но обработка еще не завершена (асинхронная обработка)
Когда использовать:
- Длительная операция (отправка email, обработка видео)
- Задача добавлена в очередь
- Результат будет доступен позже
Пример:
Запрос: POST /api/videos/upload
Ответ: 202 Accepted
Тело: {
"job_id": "abc123",
"status": "processing",
"check_status_url": "/api/jobs/abc123"
}
204 No Content
Значение: Запрос успешно выполнен, но нет содержимого в ответе
Когда использовать:
- DELETE запрос успешно удалил ресурс
- PUT запрос без возврата обновленного ресурса
- Запрос выполнен, но ничего возвращать не нужно
Пример:
Запрос: DELETE /api/users/123
Ответ: 204 No Content
Тело: (пусто)
3xx — Коды перенаправления
301 Moved Permanently
Значение: Ресурс переместился навсегда на новый адрес
Когда использовать:
- URL сайта изменился и больше не вернется
- Поисковики обновят закладку
Пример:
Запрос: GET /old-product-page
Ответ: 301 Moved Permanently
Location: /products/item-123
302 Found (или 303 See Other)
Значение: Ресурс временно доступен по другому адресу
Когда использовать:
- Временное перенаправление
- После POST обычно перенаправляют на результат (POST-Redirect-GET паттерн)
Пример:
Запрос: POST /api/login
Ответ: 302 Found
Location: /dashboard
304 Not Modified
Значение: Ресурс не изменился с момента последнего запроса
Когда использовать:
- Кэширование
- Если клиент отправил If-None-Match и ETag совпадает
- Экономия пропускной способности
Пример:
Запрос 1: GET /api/data
Ответ 1: 200 OK, ETag: "abc123"
Запрос 2: GET /api/data
Заголовок: If-None-Match: "abc123"
Ответ 2: 304 Not Modified
(тело пусто, клиент использует кэшированные данные)
4xx — Ошибки клиента
400 Bad Request
Значение: Запрос содержит синтаксическую ошибку или неправильный формат
Когда использовать:
- Невалидный JSON в теле
- Отсутствуют обязательные параметры
- Неправильный формат параметров
- Нарушены правила валидации
Пример:
Запрос: POST /api/users
Тело: {"name": "John"} // email обязателен
Ответ: 400 Bad Request
Тело: {
"error": "Validation failed",
"details": {"email": "Email is required"}
}
401 Unauthorized
Значение: Требуется аутентификация, либо аутентификация неправильная
Когда использовать:
- Отсутствует Authorization заголовок
- Токен истек
- Неправильный пароль
- Неподдерживаемый механизм аутентификации
Пример:
Запрос: GET /api/profile (без токена)
Ответ: 401 Unauthorized
Заголовок: WWW-Authenticate: Bearer realm="api"
Тело: {"error": "Token required"}
403 Forbidden
Значение: Аутентификация прошла, но пользователь не имеет прав доступа к ресурсу
Когда использовать:
- Пользователь авторизован, но не может удалить другого пользователя
- Доступ запрещен ролевой политикой
- Ограничение по IP
- Требуется премиум подписка
Различие 401 и 403:
401: "Кто ты? Пожалуйста, авторизуйся"
403: "Я знаю кто ты, но ты не имеешь права это делать"
Пример:
401: GET /api/profile (без токена)
403: GET /api/admin/users (пользователь не admin)
Пример:
Запрос: DELETE /api/users/456 (от пользователя 123)
Ответ: 403 Forbidden
Тело: {
"error": "You can only delete your own account",
"required_role": "admin"
}
404 Not Found
Значение: Запрашиваемый ресурс не существует на сервере
Когда использовать:
- Запрошен несуществующий пользователь
- Запрошен несуществующий endpoint
- URL опечатка
- Ресурс был удален
Пример:
Запрос: GET /api/users/99999 (этого пользователя нет)
Ответ: 404 Not Found
Тело: {
"error": "User not found",
"user_id": 99999
}
409 Conflict
Значение: Запрос конфликтует с текущим состоянием ресурса
Когда использовать:
- Попытка создать ресурс, который уже существует
- Версия ресурса изменилась (concurrent update)
- Конфликт в бизнес-логике
Пример:
Запрос: POST /api/users
Тело: {"email": "john@example.com"} // этот email уже существует
Ответ: 409 Conflict
Тело: {"error": "User with this email already exists"}
429 Too Many Requests
Значение: Клиент отправляет слишком много запросов в единицу времени
Когда использовать:
- Rate limiting
- Защита от брутфорса
- Защита от DDoS
Пример:
Запрос 101: GET /api/data (превышен лимит 100 запросов/мин)
Ответ: 429 Too Many Requests
Заголовки:
Retry-After: 60
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
Тело: {"error": "Rate limit exceeded. Try again in 60 seconds"}
5xx — Ошибки сервера
500 Internal Server Error
Значение: Сервер встретил непредвиденную ошибку, которую не может обработать
Когда использовать:
- Необработанное исключение
- Ошибка в коде сервера
- Проблема с БД
- Неожиданное состояние
Пример:
Запрос: GET /api/users/123
Сервер: Division by zero error
Ответ: 500 Internal Server Error
Тело: {
"error": "Internal server error",
"request_id": "req-12345"
}
502 Bad Gateway
Значение: API Gateway или proxy получил невалидный ответ от upstream сервера
Когда использовать:
- API Gateway не может связаться с бэкенд-сервисом
- Бэкенд-сервис упал
- Неправильная конфигурация proxy
Пример:
Архитектура: Клиент → API Gateway → UserService
У случилось crash UserService
Ответ: 502 Bad Gateway
Тело: {"error": "Service unavailable"}
503 Service Unavailable
Значение: Сервер временно недоступен (maintenance, overload)
Когда использовать:
- Плановое обслуживание
- Сервер перегружен
- Хранилище данных недоступно
- Временная проблема
Пример:
Запрос: GET /api/data (во время обновления БД)
Ответ: 503 Service Unavailable
Заголовок: Retry-After: 3600 (попробуйте через час)
Тело: {"error": "System is under maintenance"}
504 Gateway Timeout
Значение: Gateway не получил ответ от upstream сервера в определенное время
Когда использовать:
- Upstream сервер слишком медленный
- Timeout в сетевом подключении
- Бесконечный цикл на сервере
Таблица основных кодов
| Код | Имя | Значение |
|---|---|---|
| 200 | OK | Все хорошо |
| 201 | Created | Ресурс создан |
| 204 | No Content | Успешно, но нет содержимого |
| 301 | Moved Permanently | Постоянный редирект |
| 302 | Found | Временный редирект |
| 304 | Not Modified | Кэшированные данные |
| 400 | Bad Request | Ошибка в запросе |
| 401 | Unauthorized | Требуется аутентификация |
| 403 | Forbidden | Недостаточно прав |
| 404 | Not Found | Ресурс не найден |
| 409 | Conflict | Конфликт состояния |
| 429 | Too Many Requests | Слишком много запросов |
| 500 | Internal Server Error | Ошибка сервера |
| 502 | Bad Gateway | Upstream недоступен |
| 503 | Service Unavailable | Сервис недоступен |
| 504 | Gateway Timeout | Timeout |
Правильное использование HTTP кодов
Best Practices:
-
Используй правильный код для ситуации
- Неправильно: DELETE успешный → 200 OK
- Правильно: DELETE успешный → 204 No Content
-
Включай информацию об ошибке в тело
Хорошо: 400 Bad Request {"error": "Email is required", "field": "email"} Плохо: 400 Bad Request (просто пусто) -
Используй Location заголовок для 201 и редиректов
201 Created Location: /api/users/123 -
Не используй 200 для ошибок
Неправильно: 200 OK {"error": "Invalid request"} Правильно: 400 Bad Request {"error": "Invalid request"} -
Используй 204 когда нечего возвращать
DELETE /api/users/123 204 No Content (никакого тела)
Обработка HTTP кодов на клиенте
JavaScript пример:
fetch('/api/users/123')
.then(response => {
if (response.ok) { // 200-299
return response.json();
} else if (response.status === 401) {
// Требуется аутентификация
redirect_to_login();
} else if (response.status === 404) {
// Ресурс не найден
show_not_found_page();
} else if (response.status >= 500) {
// Ошибка сервера
show_error_message();
}
})
Понимание HTTP кодов критично для правильной разработки API. Они позволяют клиентам и серверам эффективно коммуницировать о результате запроса.