QA Interview Hub · База знань · Тести

API

Статус-коди

401 vs 403, 400 vs 422, 500 vs 503

401 Unauthorized означає, що клієнт не автентифікований: немає токена, він невалідний або прострочений. 403 Forbidden — клієнт автентифікований, але не має прав на ресурс, наприклад звичайний користувач іде в адмін-endpoint. Коротко: 401 — «хто ти?», 403 — «я знаю, хто ти, але тобі не можна».

400 Bad Request — запит некоректний синтаксично: зламаний JSON, неправильний тип даних, відсутній обов'язковий параметр. 422 Unprocessable Entity — запит синтаксично правильний, але не проходить бізнес-валідацію, наприклад email уже зайнятий або дата кінця раніше дати початку. Багато API використовують 400 для обох випадків, тому варто звірятися з контрактом.

500 Internal Server Error — неочікувана помилка на сервері, найчастіше баг у коді, і для тестувальника це завжди привід завести дефект. 503 Service Unavailable — сервіс тимчасово недоступний: перевантаження, обслуговування, залежність не відповідає. Часто 503 супроводжується заголовком Retry-After.

Групи і таблиця кодів

Перша цифра — група: 1xx інформаційні, 2xx успіх, 3xx перенаправлення, 4xx помилка клієнта, 5xx помилка сервера.

КодЗначенняКоли чекати
200 OKУспіх з тіломGET, успішний PUT або PATCH
201 CreatedРесурс створеноPOST
204 No ContentУспіх без тілаDELETE
301 / 302ПеренаправленняЗмінений URL, редірект на логін
304 Not ModifiedДані не змінились, бери з кешуКешування
400 Bad RequestНевалідний запитХибний JSON, немає обов'язкового поля
401 UnauthorizedНе автентифікованийНемає або прострочений токен
403 ForbiddenВідомо хто, але немає правЗвичайний користувач лізе в адмінку
404 Not FoundРесурсу немаєНеіснуючий id
405 Method Not AllowedМетод не підтримуєтьсяDELETE на ендпоінт, де його немає
409 ConflictКонфлікт стануДублікат email, паралельна зміна
415 Unsupported Media TypeНепідтримуваний формат тілаХибний Content-Type
422 Unprocessable EntityСинтаксис ок, бізнес-правило порушенеСума більша за баланс
429 Too Many RequestsПеревищено ліміт запитівRate limiting
500 Internal Server ErrorНеоброблена помилка сервераЗавжди баг
502 / 503 / 504Проблема шлюзу, сервіс недоступний, таймаутПадіння або перевантаження
На співбесіді: Я орієнтуюся на першу цифру: 2xx — успіх, 4xx — клієнт надіслав щось не те, 5xx — проблема на сервері. Конкретний код звіряю з документацією, бо команди по-різному використовують, наприклад, 400 і 422.

Найпопулярніші пастки

401 vs 403 — найпопулярніше питання: 401 — «хто ти?», 403 — «знаю, хто ти, але не можна». Тобто 401 — проблема з автентифікацією (немає токена, він прострочений чи зіпсований), 403 — з авторизацією (у користувача немає ролі чи прав на цей ресурс).

Баг чи ні. Невалідний ввід має давати 4xx з зрозумілим повідомленням. 500 на кривий ввід — це баг, навіть якщо «помилка ж повернулась»: 500 означає, що сервер не обробив ситуацію, і десь вилетіло виключення. Так само баг — 200 з { "error": "..." } у тілі: клієнти, моніторинг і автотести орієнтуються на статус і вважатимуть такий запит успішним.

Ще кілька моментів, на які я звертаю увагу:

  • 201 на створення має супроводжуватися id нового ресурсу в тілі або URL у заголовку Location.
  • 204 не повинен мати тіла; якщо тіло є, клієнт може його проігнорувати.
  • 404 на чужий ресурс замість 403 — нормальна практика: так API не розкриває, що ресурс існує.
  • У тілі помилки не повинно бути stack trace, SQL-запиту чи внутрішніх шляхів.
На співбесіді: 401 — не автентифікований, 403 — автентифікований, але без прав. 500 у відповідь на невалідні дані — завжди баг, як і 200 з помилкою в тілі.