HTTP-методы и коды ответов
HTTP спрашивают у всех, кто хоть раз упомянул в резюме слово API. Хорошая новость: список вопросов почти не меняется годами.
HTTP — протокол «запрос — ответ». Тестировщику из него нужны три вещи: метод (что делаем), код ответа (чем закончилось) и заголовки с телом (что передали и получили).
Вопрос 1: «Какие HTTP-методы вы знаете и чем PUT отличается от PATCH?»
Что на самом деле проверяет интервьюер
Понимаете ли вы семантику методов и связанное с ней понятие идемпотентности — а не просто помните список из пяти слов.
Развёрнутый ответ
| Метод | Назначение | Идемпотентный | Безопасный |
| GET | получить ресурс | да | да |
| POST | создать ресурс или выполнить действие | нет | нет |
| PUT | заменить ресурс целиком | да | нет |
| PATCH | изменить часть полей | обычно нет | нет |
| DELETE | удалить ресурс | да | нет |
Идемпотентность — повторный одинаковый запрос не меняет результат по сравнению с первым. Это не абстракция, а источник реальных дефектов: пользователь два раза нажал «Оплатить», сеть отвалилась и клиент повторил запрос. Если POST-оплата не защищена ключом идемпотентности, спишутся деньги дважды — классический баг, о котором приятно рассказать на собеседовании.
PUT против PATCH на примере. Есть пользователь {"name": "Аня", "city": "Казань", "phone": "+7900..."}. Запрос PUT /users/7 с телом {"city": "Москва"} по спецификации должен заменить ресурс целиком — name и phone обнулятся. Тот же PATCH /users/7 изменит только город. Проверка «что стало с непереданными полями при PUT» — отличный тест-кейс.
Вопрос 2: «Какие коды ответов знаете? Чем 401 отличается от 403, а 400 от 422?»
Что на самом деле проверяет интервьюер
Умеете ли вы по коду ответа сразу решить, чей это дефект и куда смотреть дальше.
Развёрнутый ответ
function group(code) {
if (code >= 500) return "5xx — сервер сломался, дефект бэкенда";
if (code >= 400) return "4xx — ошибка на стороне клиента/запроса";
if (code >= 300) return "3xx — редирект";
if (code >= 200) return "2xx — успех";
return "1xx — информационный";
}
[200, 201, 204, 301, 400, 401, 403, 404, 409, 422, 500, 503].forEach(c =>
console.log(c + " -> " + group(c))
);
Вывод:
200 -> 2xx — успех 201 -> 2xx — успех 204 -> 2xx — успех 301 -> 3xx — редирект 400 -> 4xx — ошибка на стороне клиента/запроса 401 -> 4xx — ошибка на стороне клиента/запроса 403 -> 4xx — ошибка на стороне клиента/запроса 404 -> 4xx — ошибка на стороне клиента/запроса 409 -> 4xx — ошибка на стороне клиента/запроса 422 -> 4xx — ошибка на стороне клиента/запроса 500 -> 5xx — сервер сломался, дефект бэкенда 503 -> 5xx — сервер сломался, дефект бэкенда
Конкретика, которую ждут:
- 201 Created — успешное создание, обычно с заголовком
Location; 204 No Content — успех без тела (типично для DELETE). - 301 — постоянный редирект, 302 — временный. Для SEO разница принципиальна.
- 400 Bad Request — запрос синтаксически некорректен; 422 Unprocessable Entity — синтаксис верный, но данные не проходят бизнес-валидацию (например, дата рождения в будущем).
- 401 Unauthorized — «я не знаю, кто вы»: нет токена или он протух. 403 Forbidden — «я знаю, кто вы, и вам сюда нельзя»: аутентификация есть, прав нет.
- 404 — ресурс не найден; 409 Conflict — конфликт состояния, например повторная регистрация того же email.
- 500 — необработанное исключение на сервере, всегда дефект; 503 — сервис временно недоступен, часто перегрузка или деплой.
Полезное правило для собеседования: любой 5xx — это баг бэкенда независимо от того, что вы отправили. Даже на заведомо мусорный запрос сервер обязан ответить 400 или 422, а не упасть с 500.
Типичные ошибки кандидатов
- Меняют местами 401 и 403 — самая частая ошибка в этом блоке.
- Считают, что 200 всегда означает успех операции. В теле может лежать
{"success": false, "error": "..."}— проверять нужно и код, и тело. - Заводят 500 на некорректный ввод как «ожидаемое поведение». Нет: некорректный ввод должен давать 4xx.
- Не могут объяснить идемпотентность и потому не тестируют повторные запросы и двойные нажатия.
- Утверждают, что DELETE должен возвращать 404 при повторном вызове, — на практике чаще возвращают 204 ради идемпотентности; правильный ход на собеседовании — сказать, что это надо уточнить в спецификации API.
Как ответить кратко
Основные методы: GET — получить, POST — создать или выполнить действие, PUT — заменить ресурс целиком, PATCH — изменить часть полей, DELETE — удалить. GET, PUT и DELETE идемпотентны: повторный запрос не меняет результат, а POST нет — отсюда классический баг с двойным списанием при повторном нажатии «Оплатить». Коды делятся на группы: 2xx — успех, 3xx — редирект, 4xx — ошибка запроса, 5xx — ошибка сервера. Важные различия: 401 — не аутентифицирован, 403 — аутентифицирован, но нет прав; 400 — некорректный синтаксис запроса, 422 — синтаксис верный, но данные не проходят бизнес-правила. Любой 5xx — дефект бэкенда, даже если запрос был заведомо мусорным.