Skip to content
Назад в блог

HTTP статус-коды: предсказуемый контракт API

2 мин. чтения
HTTP статус-коды: предсказуемый контракт API

HTTP статус-коды — часть контракта API, а не просто текст для DevTools. На них опираются клиенты, кеши, прокси, мониторинг и ретраи. По коду должно быть понятно, ошибся ли клиент, упала ли зависимость или нужно просто повторить запрос позже.

Начинайте с результата операции

Для обычных ресурсных endpoint лучше оставить успешные ответы предсказуемыми:

  • 201 Created после создания ресурса; по возможности добавьте Location;
  • 200 OK, когда чтение или обновление возвращает представление;
  • 204 No Content, когда обновление или удаление успешно, но тело ответа не нужно.

Не возвращайте 200 для любой операции с ошибкой, спрятанной в JSON. Тогда HTTP-клиенты, кеши, наблюдаемость и интеграции теряют полезный сигнал.

Отделяйте ошибку запроса от ошибки предметной области

400 Bad Request нужен для некорректного синтаксиса: битого JSON, недопустимого заголовка или запроса, который сервер не может разобрать. 422 Unprocessable Content — для успешно разобранного запроса, в котором не прошли значения полей или бизнес-правила. Дубликат уникального значения, устаревшая версия или другой конфликт с текущим состоянием ресурса обычно означает 409 Conflict.

Авторизация тоже разделяется. Возвращайте 401 Unauthorized, когда credentials отсутствуют или неверны, и 403 Forbidden, когда вызывающий уже определён, но действие ему недоступно. Стабильное значение не заставит клиент просить повторный вход там, где на самом деле не хватает роли.

Делайте временные условия понятными клиенту

Клиент может безопасно отреагировать на временную проблему, только если сервер прямо её обозначил. Для 429 Too Many Requests и 503 Service Unavailable добавляйте Retry-After, когда известна задержка. Прокси, получивший некорректный ответ upstream-сервиса, возвращает 502 Bad Gateway; если он слишком долго ждёт upstream — 504 Gateway Timeout.

Для условной записи требуйте If-Match: при его отсутствии отвечайте 428 Precondition Required, а при несовпавшем ETag — 412 Precondition Failed. Так неявный last-write-wins превращается в разрешимый конфликт.

Держите общий справочник рядом

В инструменте HTTP статус-кодов можно найти зарегистрированный код, посмотреть связанные ответы, скопировать шаблон обработки на шести языках и проверить ответ CORS-доступного endpoint прямо в браузере.

Связанные инструменты

Частые вопросы

Когда выбирать 400, а когда 422 для валидации?

400 подходит для неразбираемого или некорректного синтаксиса запроса. 422 — для синтаксически корректного запроса, где не прошли значения полей или бизнес-правила.

Чем отличаются 401 и 403?

401 означает отсутствие или недействительность учётных данных. 403 означает, что пользователь определён, но не имеет права на это действие.

Автор

Fullstack Engineer

В коммерческой разработке с 2011 года — больше 15 лет. Автор двух SaaS-продуктов: TeleGo.io и LingvoHabit.com. Статьи здесь выросли из реальной клиентской и продуктовой работы.

Подробнее об автореНаписать в Telegram

Похожие статьи

NUMBER BASE CONVERTER
NUMBER BASE CONVERTER · '26

Как компьютер представляет числа: биты, hex и IEEE 754

Почему одно число записывают как 45, 101101 и 2D, откуда взялись двоичная, восьмеричная и hex-системы и чем IEEE 754 отличается от них.

#Number Base Converter #IEEE 754 #двоичная система #шестнадцатеричная система #дополнительный код #римские цифры #ивритская гематрия #греческие цифры #история математики
5 мин. чтения
ИСТОРИЯ ФОРМАТИРОВАНИЯ КОДА
ИСТОРИЯ ФОРМАТИРОВАНИЯ КОДА · '26

Почему разработчики до сих пор спорят о форматировании

Краткая история соглашений о форматировании и точные границы beautify/minify для HTML и CSS в нашем локальном браузерном инструменте.

#история форматирования кода #Prettier #indent style #K&R vs Allman #код-стайл #табы против пробелов
2 мин. чтения
GZIP VS BROTLI
GZIP VS BROTLI · '26

Как патенты на LZW привели к gzip, а веб к Brotli

История gzip, DEFLATE и Brotli, устройство двух форматов сжатия и практический выбор между размером результата, скоростью кодирования и совместимостью.

#GZip vs Brotli #история сжатия данных #Jean-loup Gailly #Brotli Google #Deflate алгоритм #LZ77 Huffman
5 мин. чтения