Статус-код — первая вещь, на которую смотрит код, когда приходит ответ от сервера. Это число от 100 до 599, разделённое на пять семейств первой цифрой.
| Семейство | Что значит | Аналогия |
| 1xx | Информационные. Редко встречаются в REST. | «Да, понял, продолжай» |
| 2xx | Успех. | «Готово, всё ок» |
| 3xx | Перенаправление. | «Иди по другому адресу» |
| 4xx | Ошибка клиента. | «Ты накосячил» |
| 5xx | Ошибка сервера. | «Я накосячил» |
Первая цифра — самая важная подсказка. По ней одной можно сказать, что делать дальше: считать ответ успешным, перевести пользователя по новому URL, показать ошибку или ругаться на инфраструктуру.
2xx: всё прошло как надо
Главные коды успеха:
- 200 OK — универсальный успех. Запрос обработан, в теле ответа — данные. Чаще всего возвращается на GET, PUT, PATCH и иногда на DELETE (если сервер хочет вернуть удалённое).
- 201 Created — успех создания. Типичный ответ на POST, когда создан новый ресурс. В теле — созданный ресурс, в заголовке Location — его URL.
- 204 No Content — успех без тела. Запрос обработан, но возвращать нечего. Типичный ответ на удачный DELETE. Важно: тела нет — не зовите response.json(), упадёт.
3xx: иди по другому адресу
Сервер сообщает, что искомый ресурс лежит не здесь.
- 301 Moved Permanently — постоянное перенаправление. URL изменился навсегда, обновите закладки. Браузер сам делает повторный запрос на новый адрес.
- 302 Found — временное перенаправление. URL временно другой, но в будущем может вернуться.
- 304 Not Modified — ресурс не изменился с прошлой загрузки, бери из кэша. Появляется при условных запросах с If-None-Match или If-Modified-Since. Подробно — в главе 5.5. У ответа нет тела.
В REST API 3xx-коды на запросы данных встречаются редко. Чаще они — ответ на загрузку страниц.
4xx: ты накосячил
Самое богатое семейство. Сервер говорит: «твой запрос не получится обработать — и это твоя проблема, не моя».
- 400 Bad Request — запрос синтаксически или семантически некорректен. Часто — кривой JSON в теле, не хватает обязательных полей.
- 401 Unauthorized — не авторизован. Запрос ушёл без токена, с протухшим токеном или с невалидным. Несмотря на название «Unauthorized», по смыслу это «Unauthenticated» — «ты не представился».
- 403 Forbidden — запрещено. Сервер тебя узнал, но к этому ресурсу не пускает. У 401 и 403 разница тонкая, но важная: 401 — «ты кто», 403 — «знаю кто, но не пущу».
- 404 Not Found — ресурса нет. Либо URL опечатан, либо запись с таким id отсутствует.
- 405 Method Not Allowed — этот URL не поддерживает этот метод. Например, прислали DELETE на endpoint, который умеет только GET.
- 409 Conflict — конфликт. Например, пытаемся создать пользователя с email, который уже занят.
- 422 Unprocessable Entity — запрос синтаксически валиден, но не проходит бизнес-валидацию. JSON корректный, но «email не похож на email» или «возраст отрицательный». Часто используется как уточнённая версия 400.
- 429 Too Many Requests — превышен лимит запросов (rate limit). Подожди и повтори.
5xx: я накосячил
Сервер сломался. Виноват не ты — виноват сервер.
- 500 Internal Server Error — что-то упало внутри сервера. На клиенте обычно делать нечего, кроме как показать пользователю «что-то пошло не так, попробуйте позже». Бэкенд-разработчики смотрят в логи.
- 502 Bad Gateway — промежуточный сервер (часто прокси или балансировщик) получил сбойный ответ от целевого сервера.
- 503 Service Unavailable — сервер временно недоступен. Перегружен, на обслуживании, поднимается после деплоя.
- 504 Gateway Timeout — промежуточный сервер не дождался ответа от целевого. Тоже временная проблема.
На 5xx обычно правильно дать пользователю кнопку «повторить» и не фиксировать ошибку как факт — через минуту попытка может пройти.
Главное правило чтения
Когда смотрите в ответ:
- Глядите на первую цифру кода — она говорит, что произошло на уровне семейства.
- Если 2xx — читайте тело и работайте с данными.
- Если 3xx — обычно браузер сам всё переотправит, либо берите URL из Location.
- Если 4xx — ошибка вашего кода или ввода пользователя. Покажите внятное сообщение, не «что-то пошло не так».
- Если 5xx — ошибка сервера. Дайте кнопку «повторить», не пугайте пользователя.
Этим закрыли всю теорию. В модуле 4 наконец берём в руки клавиатуру и пишем первый fetch.