awesome-everything EN
↑ Обратно к восхождению

API

Статус-коды: чтение HTTP-обменов

Суть Читай реальные HTTP-обмены — статус-строку, заголовки и тело вместе — и определяй, что ответ на самом деле говорит, и фикс с наибольшим рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Статус-коды диагностируют на проводе, в сыром обмене. Читай каждую пару запрос/ответ — строку, заголовки, тело — и решай, что она реально говорит и что сеньор поменял бы первым.

Цель

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

Обмен 1 — 200, который на деле отказ

POST /v1/payments HTTP/1.1
Content-Type: application/json

{ "amount": 4200, "currency": "usd" }

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

{ "ok": false, "error": "upstream_timeout", "code": "GATEWAY_DOWN" }
Викторина

Апстрим словил таймаут, а статус-строка — 200. Каково последствие и фикс?

Обмен 2 — 401 vs 403

DELETE /tenants/acme/users/77 HTTP/1.1
Authorization: Bearer eyJhbGc...   # валидный, непросроченный токен пользователя тенанта 'globex'

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer

{ "error": "you may not delete users in another tenant" }
Викторина

Токен валиден; вызывающему просто не хватает прав на другой тенант. Что не так с этим ответом и каким он должен быть?

Обмен 3 — 503 без Retry-After и горячий цикл ретраев

GET /catalog/items?page=3 HTTP/1.1

HTTP/1.1 503 Service Unavailable
Content-Type: application/json

{ "error": "overloaded, shedding load" }

# поведение клиента: тут же переотправляет GET в тесном цикле, без задержки
Викторина

Сервер сбрасывает нагрузку через 503, но не прислал Retry-After, а клиент ретраит мгновенно. Каковы два фикса — по одному на сторону?

Обмен 4 — условное обновление и 412

PUT /docs/42 HTTP/1.1
If-Match: "v7"
Content-Type: application/json

{ "title": "Q3 plan", "body": "..." }

HTTP/1.1 412 Precondition Failed

# хранимый ETag теперь "v9" — кто-то сохранил дважды с момента последнего чтения клиентом
Викторина

Условный PUT возвращает 412, потому что ETag сдвинулся с v7 на v9. Что это говорит клиенту и что ему делать?

Итог

На проводе читай статус-строку, заголовки и тело как единое целое. 200 с телом-ошибкой лжёт каждой машине, ветвящейся по статусу, — верни реальный 5xx. 401 vs 403 упирается в аутентификацию vs авторизацию, и ошибка тут зацикливает клиента. 503 должен нести Retry-After, а клиент без него обязан отступать с джиттером, а не долбить. 412 — это работающая оптимистичная конкурентность: перечитай, сведи правку с новым ETag и повтори условную запись, а не форсируй перезапись.

Продолжить восхождение ↑Статус-коды: выпусти честный API
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.