HTTP: методы, идемпотентность, GET vs POST

В прошлом уроке запрос добрался до сервера по правильному IP-адресу и порту. Но что именно клиент просит сервер сделать — прочитать данные, создать что-то новое, изменить или удалить? Об этом говорит HTTP-метод. И от него напрямую зависит, какой баг вы получите, если запрос вдруг отправится повторно.

Чему научишься за этот урок:
— назвать пять основных HTTP-методов и то, за что отвечает каждый;
— объяснить, что такое идемпотентность и какие методы ею обладают;
— определить, идемпотентен ли конкретный метод, и почему это критично при повторе запроса.

Пять методов: что клиент просит сделать

GET — запросить (прочитать) данные, ничего не изменяя на сервере. Например, открыть каталог курсов.

POST — создать новую сущность или выполнить действие с побочным эффектом: оформить заказ, отправить форму регистрации, провести оплату.

PUT — полностью заменить существующую сущность новыми данными: например, целиком перезаписать профиль пользователя.

PATCH — частично обновить существующую сущность: изменить одно поле, не трогая остальные.

DELETE — удалить сущность: например, удалить черновик заявки на курс.

Идемпотентность: что будет, если повторить

Идемпотентность — свойство операции, при котором повторное её выполнение с теми же параметрами даёт тот же результат, то же состояние системы, что и однократное выполнение. Не идемпотентная операция при повторе меняет состояние ещё раз — например, создаёт вторую сущность там, где должна была остаться одна.

Из пяти методов идемпотентны GET, PUT и DELETE: повторный вызов не меняет итоговое состояние ещё раз (удаление уже удалённой сущности не меняет результат — сущности как не было, так и нет). POST не идемпотентен — каждый повторный вызов создаёт что-то новое. PATCH по умолчанию тоже считается не идемпотентным (в общем случае): частичное обновление не всегда просто устанавливает значение, оно может, например, прибавлять к нему — тогда повтор изменит результат ещё раз.

Почему это критично на практике: пользователь дважды нажал кнопку «Оплатить» — это запрос методом POST. Сеть на секунду подвисла, и браузер отправил тот же запрос повторно. Раз POST не идемпотентен — есть риск двойного списания денег или двойного заказа. Будь это GET (идемпотентен), повторная отправка была бы совершенно безопасна: прочитать данные дважды ничего не меняет.

Этот же сценарий двойного клика вы ещё разберёте подробнее в главе про тест-дизайн — там он станет примером негативной проверки. Здесь мы смотрим на ту же ситуацию с другой стороны: не как найти такой баг тест-дизайном, а почему он вообще возможен именно из-за свойств HTTP-метода.

  Метод   | Идемпотентен? | Что при повторе
  --------+----------------+---------------------------------
  GET     | да             | ничего не меняется
  POST    | нет            | создаётся ещё одна сущность
  PUT     | да             | состояние то же самое
  PATCH   | нет (обычно)   | результат может измениться ещё раз
  DELETE  | да             | сущности как не было, так и нет

Определяем метод и идемпотентность на практике

Разберём четыре действия на нашем полигоне:

  • Открыть каталог курсов, чтобы посмотреть список программ — GET, идемпотентен.
  • Оформить новую заявку на курс — POST, не идемпотентен.
  • Изменить свои контактные данные полностью (перезаписать профиль новыми значениями) — PUT, идемпотентен.
  • Удалить черновик заявки на курс — DELETE, идемпотентен.

Итог:
— методы отвечают на вопрос «что делать»: GET — прочитать, POST — создать или выполнить действие, PUT — заменить целиком, PATCH — обновить частично, DELETE — удалить;
— идемпотентность отвечает на вопрос «что будет, если повторить»: GET, PUT и DELETE идемпотентны, POST и PATCH — нет;
— именно с POST и PATCH чаще всего случаются баги двойного действия при повторных запросах.

Контрольный вопрос. Какой HTTP-метод используется, чтобы прочитать данные, не изменяя ничего на сервере?

АGET
БPOST
ВDELETE

Подсказка: Это метод, который только запрашивает данные, но не меняет состояние.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Какой HTTP-метод используется, чтобы создать новую сущность или выполнить действие с побочным эффектом (например, оформить заказ)?

АPOST
БGET
ВPUT

Подсказка: Речь о создании нового, а не о чтении уже существующего.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Что делает метод PUT?

АПолностью заменяет существующую сущность новыми данными
БЧастично обновляет существующую сущность
ВУдаляет сущность

Подсказка: Разница с PATCH в том, заменяются ли данные целиком или только часть.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Что делает метод PATCH?

АЧастично обновляет существующую сущность
БПолностью заменяет существующую сущность
ВСоздаёт новую сущность

Подсказка: Это про изменение только части данных, а не всей записи целиком.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Как называется свойство операции, при котором повторное её выполнение с теми же параметрами даёт тот же результат, что и однократное? Ответь одним словом.

Подсказка: Это ключевое свойство операций, вокруг которого строится весь урок — оно объясняет, что случится с состоянием системы при повторе действия.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Какие из перечисленных методов идемпотентны (выбери все подходящие)?

Выберите все верные варианты.

АGET
БPOST
ВPUT
ГPATCH
ДDELETE

Подсказка: Сверь каждый метод из списка с определением идемпотентности из урока: меняется ли итоговое состояние при повторном вызове.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Что делает метод DELETE?

АУдаляет сущность
БСоздаёт новую сущность
ВЧастично обновляет сущность

Подсказка: Само название метода прямо указывает на действие.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Задание. На нашем учебном полигоне ученик открывает каталог курсов, чтобы посмотреть список доступных программ, ничего не создавая и не изменяя. Какой HTTP-метод здесь используется? Ответь одним словом — названием метода на английском, заглавными буквами.

Подсказка: Это действие только читает данные, не меняя ничего на сервере.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Задание. Ученик на нашем полигоне нажимает кнопку «Оплатить» для оформления заказа на курс — это запрос методом POST. Сеть на секунду подвисает, и браузер по ошибке отправляет тот же запрос повторно, пока первый ещё обрабатывается сервером (этот же сценарий двойного клика вам ещё встретится в главе про тест-дизайн, там кнопка будет называться «Зарегистрироваться»). Как одним словом описать то, что вероятнее всего произойдёт с суммой оплаты при такой повторной отправке? Ответь одним словом.

Подсказка: POST не идемпотентен: вспомни, что происходит с результатом операции при её повторе, если метод не гарантирует одинаковый исход.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Задание. Разработчик предлагает: «Если запрос не получил ответ вовремя, будем автоматически повторять его ещё раз — на всякий случай». Опиши в 2-3 предложениях, для каких из пяти методов автоповтор безопасен, а для каких — рискован, и почему.

Критерий приёмки: названы как минимум один из безопасных методов (GET, PUT или DELETE) и как минимум один из рискованных (POST или PATCH); объяснение опирается на понятие идемпотентности (повтор не идемпотентной операции меняет состояние ещё раз, например создаёт вторую сущность). Общие фразы без ссылки на идемпотентность не засчитываются.

Подсказка: Раздели пять методов на две группы по тому, меняет ли повторное выполнение конечный результат — это и есть критерий идемпотентности.

✅ Готово, если: ответ раскрывает то, что просит критерий приёмки в задании выше.

Онлайн-проверка ответа появится позже

Задание. Форма «изменить контактные данные» на полигоне отправляет запрос методом PATCH с телом {«phone»: «+79991234567»} — то есть каждый раз просто устанавливает номер телефона в конкретное указанное значение, а не прибавляет что-то к текущему. Технически повторная отправка этого же PATCH-запроса с тем же телом даст то же самое состояние — номер останется тем же. Это совпадение результата при повторе объясняется тем, что гарантирует сам метод PATCH в общем случае, или тем, как именно написан конкретно этот запрос на полигоне? Ответь одним словом.

Подсказка: Вопрос не про то, что получилось именно в этом запросе, а про то, что метод PATCH гарантирует сам по себе, в общем случае, независимо от того, как написан конкретный запрос.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Что дальше

Мы разобрали, что означает каждый метод и почему идемпотентность важна на практике. Но как сервер сообщает, что запрос обработан — успешно, с ошибкой в самом запросе или со сбоем на стороне сервера? Об этом расскажут коды ответа HTTP в следующем уроке.

Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева