API и JSON

Почему HTTP 200 ещё не означает, что API исправен

Почему успешный HTTP 200 не гарантирует исправность API и как проверять JSON, обязательные поля, бизнес-значения, Content-Type, latency и стабильность ответа.

Опубликовано: 31 августа 2026 г.Обновлено: 31 августа 2026 г.
Схема многоуровневой проверки API: HTTP 200 дополняется контролем JSON, значений и бизнес-критерия

HTTP 200 OK говорит, что HTTP-запрос успешно обработан на уровне протокола и сервер вернул успешный ответ. Но 200 сам по себе не доказывает, что API выполняет нужную бизнес-функцию.

Endpoint может вернуть 200 и одновременно сообщить в JSON, что база данных недоступна, данные устарели, очередь не работает или операция завершилась внутренней ошибкой. Поэтому надёжная проверка API должна смотреть не только на status code, но и на содержимое ответа, время и бизнес-критерий.

Что на самом деле означает HTTP 200

RFC 9110 определяет 200 как успешное выполнение запроса. Смысл response body зависит от HTTP method: для GET это представление ресурса, для POST — результат или состояние действия и т. д.

HTTP transport
  ↓
200 OK
  ↓
ответ получен успешно

Но над этим уровнем остаётся application semantics:

200 OK
  ↓
JSON valid?
  ↓
нужные поля есть?
  ↓
значения означают успех?
  ↓
критичная зависимость реально работает?

Схема проверки API после HTTP 200: JSON, обязательные поля, значения и бизнес-критерий

Пример: два одинаковых HTTP 200

Успешный ответ:

HTTP/1.1 200 OK
Content-Type: application/json

{"status":"ok","orders_available":true}

Проблемный ответ:

HTTP/1.1 200 OK
Content-Type: application/json

{"status":"error","message":"database unavailable"}

Для проверки только по status code оба ответа одинаковы. Для пользователя — нет.

Почему API вообще возвращает 200 с ошибкой внутри

Причины бывают разные:

  • исторический контракт;
  • legacy-клиенты;
  • GraphQL-подобная модель ответа;
  • приложение всегда заворачивает результат в общий envelope;
  • разработчик ошибочно использует 200 для всех исходов;
  • endpoint является агрегатором и сообщает частичные результаты.

Не нужно автоматически объявлять любой такой контракт неправильным: сначала посмотрите спецификацию конкретного API. Но мониторинг должен учитывать фактическую семантику ответа.

Уровень 1. Проверка соединения

До HTTP нужны:

DNS → TCP → TLS

Если TLS handshake не прошёл, никакого 200 вообще не будет.

Уровень 2. Проверка HTTP status

Для успешного GET ожидаемый критерий может быть:

status == 200

Для другого endpoint нормой может быть 204, 201 или даже контролируемый 4xx в негативном тесте.

Поэтому «любой 2xx» не всегда достаточно точно.

Уровень 3. Проверка Content-Type

Если endpoint обещает JSON:

Content-Type: application/json

а фактически CDN вернул HTML-заглушку с 200, status check это не заметит.

Через curl:

curl -i https://api.example.com/health

Уровень 4. Проверка JSON

curl -sS https://api.example.com/health | jq .

Если jq не может разобрать ответ, API не соответствует ожидаемому JSON-контракту даже при HTTP 200.

Уровень 5. Проверка обязательных полей

Например, контракт требует:

{
  "status": "ok",
  "version": "..."
}

Проверка только валидности JSON недостаточна. Пустой объект {} тоже валидный JSON.

Уровень 6. Проверка значений

Нужно подтвердить конкретный признак:

$.status == "ok"

или другое поле, которое действительно означает работоспособность функции.

Дерево выбора критерия API: HTTP 200 недостаточно без проверки JSON-поля и бизнес-смысла ответа

Уровень 7. Проверка latency

API может технически возвращать 200, но отвечать настолько медленно, что пользовательский сценарий уже нарушен.

Через curl:

curl -sS -o /dev/null \
  -w 'code=%{http_code} total=%{time_total}s\n' \
  https://api.example.com/health

Один «успешный» запрос за 20 секунд нельзя считать эквивалентом стабильного ответа за нормальное для вашего сервиса время.

Не существует универсального timeout для всех API: порог должен соответствовать реальному SLO и назначению endpoint.

Почему /health тоже может обманывать

Плохой health endpoint:

{"status":"ok"}

который всегда возвращается без проверки критичных зависимостей, подтверждает только то, что процесс способен ответить HTTP.

С другой стороны, health endpoint не должен бездумно проверять все внешние интеграции и превращаться в источник каскадных отказов. Критерий зависит от того, что именно вы хотите доказать.

Проверяйте пользовательскую функцию, а не только технический endpoint

Для интернет-магазина:

/health → 200
/api/catalog → 200
/api/checkout → 200 + {"available": false}

С точки зрения бизнеса сервис уже частично недоступен.

Пошаговая диагностика HTTP 200 с неправильным содержимым

Шаг 1. Сохраните сырой ответ

curl -i https://api.example.com/v1/status

Шаг 2. Проверьте Content-Type

Убедитесь, что пришёл ожидаемый формат.

Шаг 3. Проверьте JSON

curl -sS https://api.example.com/v1/status | jq .

Шаг 4. Проверьте конкретное поле

curl -sS https://api.example.com/v1/status | jq -r '.status'

Шаг 5. Сопоставьте request ID и логи

Если JSON содержит status:error, найдите ту же операцию в application logs.

Шаг 6. Повторите несколько раз

Плавающая проблема может выглядеть так:

A → 200 + status=ok
B → 200 + status=error
C → 200 + status=ok

Это часто указывает на разные backend-инстансы или нестабильную зависимость.

Как выбрать правильный критерий мониторинга

Хороший критерий должен быть:

  • стабильным;
  • машинно проверяемым;
  • связанным с реальной функцией;
  • безопасным для частого вызова;
  • не зависящим от случайных данных;
  • достаточно узким, чтобы объяснять сбой.

Например:

HTTP status = 200
AND response time < выбранного порога
AND JSON $.status = "ok"

Как проверить восстановление

После исправления нужна серия проверок:

HTTP code    → ожидаемый
Content-Type → ожидаемый
JSON parse   → OK
status field → ok
latency      → в допустимом диапазоне
несколько запросов подряд → стабильны

Проверка восстановления API: стабильные HTTP 200 дополняются контролем JSON, значения поля и времени ответа

Один 200 после инцидента не доказывает полного восстановления.

Связь с мониторингом

UpWatch можно использовать для проверки API не только по HTTP-коду, но и по JSON-критериям. Это позволяет отличать транспортно успешный 200 от ответа, который не соответствует ожидаемому состоянию приложения.

Для общей методики см. Как мониторить API endpoint и Как проверить доступность REST API.

Типичные ошибки

  • считать любой 200 доказательством исправности;
  • проверять только валидность JSON;
  • выбирать случайное поле без бизнес-смысла;
  • игнорировать latency;
  • проверять только /health;
  • не повторять запрос после инцидента;
  • использовать state-changing POST для частого мониторинга без идемпотентности.

Практический чек-лист

  1. Определить ожидаемый HTTP code.
  2. Проверить Content-Type.
  3. Проверить, что JSON разбирается.
  4. Проверить обязательные поля.
  5. Выбрать одно или несколько значений успеха.
  6. Определить допустимое время ответа.
  7. Убедиться, что request безопасен.
  8. Проверить несколько backend-инстансов серией запросов.
  9. Проверить поведение при отказе зависимости.
  10. Убедиться, что монитор обнаруживает 200 + error.
  11. Проверить recovery серией запросов.
  12. Пересматривать критерий при изменении API-контракта.

Источники и спецификации

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

Разве HTTP 200 не означает успех?

Он означает успешное выполнение HTTP-запроса по семантике протокола, но не доказывает, что содержимое ответа соответствует бизнес-ожиданию конкретного API.

Может ли API вернуть 200 и ошибку в JSON?

Да. Это зависит от контракта API. Для мониторинга важно проверять не только status code, но и содержимое ответа.

Достаточно ли проверить, что JSON валиден?

Нет. Пустой объект или JSON с status=error тоже может быть синтаксически валидным.

Что лучше проверять кроме 200?

Content-Type, валидность JSON, обязательные поля, конкретные значения, время ответа и стабильность нескольких последовательных запросов.

Нужно ли мониторить /health?

Можно, но критерий должен соответствовать цели. Технический health endpoint не всегда подтверждает работоспособность критичной пользовательской функции.

Схема уровней мониторинга API: соединение, HTTP-код, время ответа и проверка JSON
API и JSON

Что такое мониторинг API и зачем он нужен

Как устроен мониторинг API, какие уровни проверки нужны кроме HTTP 200, что контролировать в REST endpoint и как отличить доступность транспорта от корректной работы бизнес-ответа.

Читать материал
Схема проверки REST API по соединению, HTTP-коду, времени ответа и JSON-критерию
API и JSON

Как проверить доступность REST API

Практический алгоритм проверки REST API: DNS, TLS, HTTP-код, время ответа, JSON, авторизация и критерии, которые отличают реальную работоспособность от простого HTTP 200.

Читать материал
Схема мониторинга API endpoint по HTTP-коду, времени ответа, JSON и бизнес-критерию
API и JSON

Как мониторить API endpoint

Как выбрать API endpoint для мониторинга и задать критерии успеха: HTTP-код, timeout, JSON, авторизация, безопасный запрос, частота проверки и диагностика сбоев.

Читать материал
Схема проверки API через curl: метод, заголовки, авторизация, HTTP-код, JSON и время ответа
API и JSON

Как проверить API через curl

Практическое руководство по проверке API через curl: GET, POST, JSON, headers, Bearer Token, Basic Auth, HTTP-код, redirect, timeout, TLS и время ответа.

Читать материал
Схема HTTP 422 Unprocessable Content: корректный запрос отклоняется на уровне семантической проверки
HTTP-ошибки и диагностика

Ошибка 422 Unprocessable Content

Что означает HTTP 422 Unprocessable Content, как отличить его от 400, 409 и 415 и как диагностировать семантические ошибки JSON, валидацию полей и бизнес-ограничения API.

Читать материал