Все разборы

HTTP и API

Как ответить на вопрос «HTTP-методы: чем GET отличается от POST» на собеседовании QA

Разбираем HTTP-методы по RFC 9110: безопасность, идемпотентность, разница GET и POST и пример ответа, который убедит интервьюера.

Зачем это спрашивают

Вопрос про методы звучит просто, поэтому его часто задают первым в блоке про API. Интервьюер проверяет не память, а понимание: знаете ли вы, что метод — это договорённость о смысле запроса, и умеете ли из этого смысла выводить проверки. Тестировщик, который понимает идемпотентность, сам догадается проверить двойной клик по кнопке «Оформить заказ» или повтор запроса после обрыва сети. Тот, кто помнит только «GET получает, POST отправляет», такие сценарии пропустит.

Вторая часть — «чем GET отличается от POST» — ловушка на популярный миф о том, что POST «безопаснее». Хороший ответ разводит два значения слова «безопасный»: в терминах HTTP и в терминах защиты данных.

Как построить сильный ответ

Удобная схема из трёх шагов.

1. Перечислите методы и их смысл.

Метод Смысл Безопасный Идемпотентный
GET получить представление ресурса да да
HEAD то же, что GET, но без тела ответа да да
POST обработать данные: создать ресурс, запустить действие нет нет
PUT создать или полностью заменить ресурс по адресу нет да
PATCH частично изменить ресурс нет не обязательно
DELETE удалить ресурс нет да
OPTIONS узнать, какие возможности доступны для ресурса да да

Ещё есть TRACE и CONNECT, но в работе тестировщика они встречаются редко; достаточно упомянуть, что они существуют.

2. Объясните два свойства.

  • Безопасный метод по RFC 9110 не должен менять состояние сервера по замыслу клиента. GET, HEAD, OPTIONS и TRACE — безопасные.
  • Идемпотентный метод при повторе того же запроса оставляет сервер в том же состоянии, что и после первого. Идемпотентны все безопасные методы, а также PUT и DELETE. POST — нет. PATCH — зависит от того, как устроено изменение.

Сразу добавьте, почему это важно на практике: клиенты, прокси и браузеры могут автоматически повторять идемпотентные запросы при сбое соединения, а повтор POST без защиты на сервере способен создать дубль.

3. Сравните GET и POST по существу.

  • GET передаёт параметры в строке запроса, POST — обычно в теле.
  • Ответы на GET по умолчанию могут кэшироваться браузером и прокси, ответы на POST на практике почти никогда не кэшируются.
  • GET-адрес можно сохранить в закладки, переслать, он остаётся в истории браузера и в логах серверов. Поэтому пароли, токены и персональные данные в параметрах GET передавать нельзя.
  • POST не шифрует данные. Защищает их TLS, то есть HTTPS, и он одинаково защищает и строку запроса, и тело при передаче. Разница в том, где данные потом оседают.
  • Длина адреса ограничена на практике серверами и браузерами, тело запроса — гораздо меньше.
GET /api/products?category=shoes&sort=price HTTP/1.1
Host: <домен магазина>

POST /api/orders HTTP/1.1
Host: <домен магазина>
Content-Type: application/json

{"items": [{"productId": 3, "qty": 1}]}

Пример ответа

Основные методы — GET, POST, PUT, PATCH и DELETE, ещё есть HEAD и OPTIONS. GET получает ресурс, POST создаёт ресурс или запускает действие, PUT заменяет ресурс целиком, PATCH меняет его частично, DELETE удаляет. Я всегда держу в голове два свойства. Безопасные методы — GET, HEAD, OPTIONS — не должны менять данные. Идемпотентные — это безопасные плюс PUT и DELETE: если повторить запрос, состояние сервера не изменится. POST не идемпотентен, поэтому я обязательно проверяю повторную отправку формы и двойной клик — не появится ли второй заказ. Разница GET и POST не в безопасности: данные защищает HTTPS. Но параметры GET остаются в истории браузера и логах, поэтому пароли и личные данные туда класть нельзя. Ещё ответы на GET кэшируются, а на POST — нет.

Частые ошибки

  • Называть POST идемпотентным или говорить, что PUT и POST «одно и то же, просто разные названия».
  • Утверждать, что POST «безопаснее, потому что данные скрыты». В DevTools тело POST видно так же, как и строка запроса.
  • Путать идемпотентность с одинаковым ответом. Повторный DELETE может вернуть 404 — метод при этом остаётся идемпотентным.
  • Говорить, что GET «вообще не может» менять данные. Может, если так написал разработчик, — и это дефект проектирования, о котором стоит сообщить.
  • Отвечать только определениями без единого примера проверки.

Пример на MarketCove

Представьте, что вы проверяете оформление заказа в учебном магазине MarketCove. Откройте Swagger на /api/docs и посмотрите, какие методы поддерживают эндпоинты.

  • GET /api/products и GET /api/products/{id} — безопасные. Вызовите их несколько раз подряд: данные каталога не должны меняться, а ответ должен быть одинаковым.
  • Оформление заказа через /api/shop/orders — это создание ресурса, обычно POST. Здесь главный вопрос: что будет, если отправить тот же запрос дважды? Подумайте, какое поведение ожидаете: второй заказ, ошибку или защиту от дубля. Затем проверьте через GET /api/orders или историю в профиле, сколько заказов появилось на самом деле.
  • Попробуйте вызвать эндпоинт неподдерживаемым методом, например DELETE на каталог. Ожидаемо получить 405 Method Not Allowed, а не 500. Подробнее о кодах — в статье про коды ответа HTTP.
  • Проверьте в DevTools на вкладке Network, какие запросы уходят при входе. Если логин или токен передаются в строке адреса, это повод для баг-репорта.

Задание для практики

Откройте API-песочницу или Swagger магазина и составьте таблицу из трёх столбцов: эндпоинт, метод, что произойдёт при повторе запроса. Для каждого POST запишите, как вы проверите отсутствие дублей и через какой GET убедитесь в результате. Потом проговорите вслух ответ на вопрос «чем PUT отличается от PATCH» с примером изменения профиля — уложитесь в минуту. Если хотите проверить себя на скорость, пройдите блиц.

Что спросят следом

  • Можно ли отправить тело в GET-запросе?
    Технически отправить можно, но RFC 9110 не определяет смысл тела у GET, и многие серверы, прокси и библиотеки его отбрасывают или отклоняют. Если API ждёт фильтры в теле GET, это повод задать вопрос разработчикам: такой запрос может по-разному вести себя на разных звеньях цепочки.
  • Почему DELETE считается идемпотентным, если второй вызов вернёт 404?
    Идемпотентность говорит о состоянии сервера, а не о коде ответа. После первого и после десятого DELETE ресурса нет, состояние одинаковое. Код ответа при повторе может отличаться, и это нормально.
  • Чем PUT отличается от PATCH?
    PUT передаёт полное новое представление ресурса и заменяет его целиком, поэтому повтор того же PUT даёт тот же результат. PATCH передаёт набор изменений; он идемпотентен только если изменения устроены как присваивание, а операция вида «увеличить на единицу» при повторе даст другой итог.
  1. Q-01
    Какие коды ответа HTTP вы знаете? Чем 401 отличается от 403?
  2. Q-02
    Чем REST отличается от SOAP (и GraphQL)?
  3. Q-03
    Что вы проверяете при тестировании API?
  4. Q-04
    Как вы работаете в Postman?

Отрепетировать ответ с куратором

В сопровождении — весь банк вопросов, мок-собеседование и разбор каждого настоящего собеседования, пока не придёт оффер. Гарантий трудоустройства не даём — готовим к тому, что спросят.

Весь банк вопросов

Здесь — разбор одного вопроса. Банк целиком, с разбором и повторением, открыт в сопровождении; три вопроса — в витрине тренажёра.