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 — дефект бэкенда, даже если запрос был заведомо мусорным.

Проверьте себя
1. Пользователь передал валидный токен, но пытается открыть чужой заказ. Какой код ответа корректен?
A401 Unauthorized
B403 Forbidden
C400 Bad Request
D500 Internal Server Error
2. Тестировщик отправил в API заведомо некорректное тело запроса и получил 500. Как это оценить?
AЭто ожидаемо: раз данные мусорные, сервер имеет право упасть
BЭто дефект бэкенда: на некорректные данные сервер должен отвечать 400 или 422
CЭто дефект тестировщика — так тестировать нельзя
DЭто нормально, если в теле ответа есть текст ошибки
3. Какой метод НЕ является идемпотентным и потому требует защиты от повторной отправки?
AGET
BPUT
CPOST
DDELETE