Экспресс-пост на тему HTTP-методов, которая часто встречается на собесах.
В чем отличие методов POST, PUT и PATCH? Чаще спрашивают про два метода из трех: разница между POST и PUT или разница между PUT и PATCH.
Короткий ответ:
🟢POST - для создания ресурса
🔵PUT - для изменения ресурса
🟡PATCH - для частичного изменения ресурса
Разница между POST и PUT, думаю, ясна. А вот между PUT и PATCH тут немного сложнее. Смысл в том, что PUT целиком перезаписывает ресурс, соответственно, следует отправлять полный объект для изменения. А вот PATCH не перезаписывает объект, а меняет только отдельно взятые поля.
По крайней мере так предполагалось создателем HTTP и REST Роем Филдингом. Но, конечно же, под капотом внутри системы алгоритм обработки может быть какой-то свой и даже с помощью POST или PUT будет частично обновляться объект. Такое сделать можно, но с точки зрения концепции это будет неправильно.
Возвращаясь к разбору методов, как можно было уже догадаться, все они небезопасные. Это означает, что все эти методы могут изменять ресурс. Например, метод GET - безопасный, так как при правильном его использовании, ресурсы не изменяются, а только предоставляются.
А вот с идемпотентностью все немного интереснее. Идемпотентность — свойство, которое позволяет при повторном применении операции к объекту давать тот же результат, что и при первом. Например, при оформлении заказа у вас моргнул интернет, и вы не получили в приложении реакции на нажатие кнопки. Если эта операция идемпотентна, то вы сможете нажать на кнопку повторно и получить гарантировано один и тот же результат, даже если заказ уже все-таки оформлен. Если идемпотентность у такой операции отсутствует, то при повторном клике на кнопку будет создаваться новый заказ раз за разом.
Так вот, метод PUT удовлетворяет этому свойству, а POST и PATCH(частично) - нет.
Почему? Потому что PUT обращается к конкретному объекту по его ключу и полностью заменяет его, а при вызове POST генерируется новый объект. Поэтому сколько не вызови одинаковыми запросами PUT в конечном итоге будет один и тот же результат, а при использовании POST будет создано столько объектов, сколько будет отправлено запросов.
С PATCH немного сложнее, он может быть неидемпотентен в тех случаях, когда у объекта есть какой-нибудь флаг или индекс. Соответственно, при отправке нескольких запросов на один и тот же ресурс можно сломать логику у флага или сделать некорректным значение индекса.
Для метода POST можно добиться идемпотентсности искусственно. Например, можно генерировать ключ на стороне клиента или добавить на стороне сервера умный обработчик, который по каким-то параметрам будет игнорировать дубль запроса.
Для PATCH также обычно на серверной стороне добиваются идемпотентности. Например, за счет добавления дополнительной логики с проверками.
#быстростатья
Post #322
1.01K

- ❤ 12
- 👍 5
- 🔥 5