Статус-код — первая вещь, на которую смотрит код, когда приходит ответ от сервера. Это число от 100 до 599, разделённое на пять семейств первой цифрой.

Семейство Что значит Аналогия
1xx Информационные. Редко встречаются в REST. «Да, понял, продолжай»
2xx Успех. «Готово, всё ок»
3xx Перенаправление. «Иди по другому адресу»
4xx Ошибка клиента. «Ты накосячил»
5xx Ошибка сервера. «Я накосячил»

Первая цифра — самая важная подсказка. По ней одной можно сказать, что делать дальше: считать ответ успешным, перевести пользователя по новому URL, показать ошибку или ругаться на инфраструктуру.

2xx: всё прошло как надо

Главные коды успеха:

  • 200 OK — универсальный успех. Запрос обработан, в теле ответа — данные. Чаще всего возвращается на GETPUTPATCH и иногда на 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 обычно правильно дать пользователю кнопку «повторить» и не фиксировать ошибку как факт — через минуту попытка может пройти.

Главное правило чтения

Когда смотрите в ответ:

  1. Глядите на первую цифру кода — она говорит, что произошло на уровне семейства.
  2. Если 2xx — читайте тело и работайте с данными.
  3. Если 3xx — обычно браузер сам всё переотправит, либо берите URL из Location.
  4. Если 4xx — ошибка вашего кода или ввода пользователя. Покажите внятное сообщение, не «что-то пошло не так».
  5. Если 5xx — ошибка сервера. Дайте кнопку «повторить», не пугайте пользователя.

Этим закрыли всю теорию. В модуле 4 наконец берём в руки клавиатуру и пишем первый fetch.