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 з помилкою в тілі.