В прошлом уроке запрос добрался до сервера по правильному 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-метод используется, чтобы прочитать данные, не изменяя ничего на сервере?
Подсказка: Это метод, который только запрашивает данные, но не меняет состояние.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Какой HTTP-метод используется, чтобы создать новую сущность или выполнить действие с побочным эффектом (например, оформить заказ)?
Подсказка: Речь о создании нового, а не о чтении уже существующего.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Что делает метод PUT?
Подсказка: Разница с PATCH в том, заменяются ли данные целиком или только часть.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Что делает метод PATCH?
Подсказка: Это про изменение только части данных, а не всей записи целиком.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Как называется свойство операции, при котором повторное её выполнение с теми же параметрами даёт тот же результат, что и однократное? Ответь одним словом.
Подсказка: Это ключевое свойство операций, вокруг которого строится весь урок — оно объясняет, что случится с состоянием системы при повторе действия.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Какие из перечисленных методов идемпотентны (выбери все подходящие)?
Выберите все верные варианты.
Подсказка: Сверь каждый метод из списка с определением идемпотентности из урока: меняется ли итоговое состояние при повторном вызове.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Что делает метод DELETE?
Подсказка: Само название метода прямо указывает на действие.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Задание. На нашем учебном полигоне ученик открывает каталог курсов, чтобы посмотреть список доступных программ, ничего не создавая и не изменяя. Какой HTTP-метод здесь используется? Ответь одним словом — названием метода на английском, заглавными буквами.
Подсказка: Это действие только читает данные, не меняя ничего на сервере.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Задание. Ученик на нашем полигоне нажимает кнопку «Оплатить» для оформления заказа на курс — это запрос методом POST. Сеть на секунду подвисает, и браузер по ошибке отправляет тот же запрос повторно, пока первый ещё обрабатывается сервером (этот же сценарий двойного клика вам ещё встретится в главе про тест-дизайн, там кнопка будет называться «Зарегистрироваться»). Как одним словом описать то, что вероятнее всего произойдёт с суммой оплаты при такой повторной отправке? Ответь одним словом.
Подсказка: POST не идемпотентен: вспомни, что происходит с результатом операции при её повторе, если метод не гарантирует одинаковый исход.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Задание. Разработчик предлагает: «Если запрос не получил ответ вовремя, будем автоматически повторять его ещё раз — на всякий случай». Опиши в 2-3 предложениях, для каких из пяти методов автоповтор безопасен, а для каких — рискован, и почему.
Критерий приёмки: названы как минимум один из безопасных методов (GET, PUT или DELETE) и как минимум один из рискованных (POST или PATCH); объяснение опирается на понятие идемпотентности (повтор не идемпотентной операции меняет состояние ещё раз, например создаёт вторую сущность). Общие фразы без ссылки на идемпотентность не засчитываются.
Подсказка: Раздели пять методов на две группы по тому, меняет ли повторное выполнение конечный результат — это и есть критерий идемпотентности.
✅ Готово, если: ответ раскрывает то, что просит критерий приёмки в задании выше.
Онлайн-проверка ответа появится позже
Задание. Форма «изменить контактные данные» на полигоне отправляет запрос методом PATCH с телом {«phone»: «+79991234567»} — то есть каждый раз просто устанавливает номер телефона в конкретное указанное значение, а не прибавляет что-то к текущему. Технически повторная отправка этого же PATCH-запроса с тем же телом даст то же самое состояние — номер останется тем же. Это совпадение результата при повторе объясняется тем, что гарантирует сам метод PATCH в общем случае, или тем, как именно написан конкретно этот запрос на полигоне? Ответь одним словом.
Подсказка: Вопрос не про то, что получилось именно в этом запросе, а про то, что метод PATCH гарантирует сам по себе, в общем случае, независимо от того, как написан конкретный запрос.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Что дальше
Мы разобрали, что означает каждый метод и почему идемпотентность важна на практике. Но как сервер сообщает, что запрос обработан — успешно, с ошибкой в самом запросе или со сбоем на стороне сервера? Об этом расскажут коды ответа HTTP в следующем уроке.
