В первую очередь стоит начать с того, а что же такое HTTP.
HTTP (Hypertext Transfer Protocol) - это протокол прикладного уровня, который определяет правила обмена данными между клиентом и сервером.
В свою очередь HTTP методы - это команды посредством которых клиент взаимодействует с сервером по протоколу HTTP, именно методы определяют, тип операции, которую хочет совершить клиент, например: получение, добавление, удаление данных и тд.
Методы разделяются по своим свойствам. Бывают следующие виды методов:
1) Безопасные - это методы, которые не изменяют состояние сервера, то есть методы, которые используются только для чтения и не имеют side effects. К таким методам относятся: GET, HEAD, OPTION, в дальнейшем рассмотрим все эти методы подробнее.
2) Идемпотентные - это методы, которые не имеют никаких побочных эффектов(side-effects). Иными словами, идемпотентные методы - это методы, которые при повторном идентичном запросе не изменяют состояние сервера. Как пример, рассмотрим случай добавления сущности на сервер, у нас есть два варианта решения этой задачи:
- Добавление сущности, когда сервер самостоятельно выбирает новый идентификационный номер ресура.(POST)
- Добавление сущности, когда клиент задает идентификационный номер ресурса.(PUT)
Если рассматривать эти два варианта, то второй метод будет считаться идемпотентным, так как мы вносим изменения в один и тот же ресурс на сервере и при многократном воспроизведении запроса данные на сервере не будут меняться. А что же с первым вариантом? Каждый раз, когда мы будем отправлять запрос сервер будет создавать новую сущность, как раз из-за этого первый вариант и не будет считаться идемпотентным.
Исходя из описания идемпотентного свойства можно сделать следующий вывод:
Все безопасные методы являются идемпотентными, но не все идемпотентные являются безопасными
3) Кэшируемые - это методы ответы которого могут быть закэшированы, то есть сохранены для дальнейшего использования, тем самым снижая кол-во запросов к серверу и увеличению пропускной способности.
Кэшируемые методы имеют следующие ограничения:
- Методы GET и HEAD могут быть закэшированы, методы POST и PATCH могут закэшированы, если указаны признак "свежести" (заголовок Expires, который указывает дату и время, по истечении которых кэш должен считаться устаревшим), а также установлен заголовок Content-Location. Другие методы считаются некэшируемыми.
- Коды ответов, которые приходят с сервера, известны как кэшируемые: 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501.
- HTTP заголовок Cache-Control не ограничивает кэширование.
Некоторые запросы, которые не являются кэшированными могут инвалидировать закэшированные данные, в случае, если запрос проходит по одному и тому же URI.
Например, мы сохранили данные с помощью метода GET, а далее совершили PUT запрос по тому же URI, тогда ответ от некэшируемого запроса сделает недействительным предыдущий закэшированный ответ, полученный от GET.
Настало время перейти к самим методам.
-GET - метод, который запрашивает ресурс с сервера, то есть извлекает данные с сервера для чтения.
Данный метод является безопасным, идемпотентным и кэшируемым. При этом в данном методе есть тело ответа и можно написать тело запроса, но этого лучше не делать по следующим причинам:
а) Сам метод GET подразумевает под собой операцию чтение, а передача тела запроса нарушает семантику, так как тело запроса необходимо дополнительно обрабатывать на сервере.
б) Многие сервера могут игнорировать или даже отклонять тела запросов в методе GET, что может привести к некорректному вызову метода.
в) Возможность возникновения проблем с кэшированием, так как кэши не будут учитывать тело запроса, поэтому при одинаковом URI, но разных телах запроса данные, приходящие с сервера, могут отличаться, тем самым, закэшированные данные могут быть неверные.
г) Проблемы с безопасностью, поскольку тело запроса в методе GET является специфической, то могут возникнуть такие проблемы, как утечка данных или же CSRF атаки и др.
HEAD - метод, который запрашивает ресурс также, как и метод GET, но без тела ответа. Мы можем использовать данный метод, например, для того, чтобы проверить загрузку большого объема данных, для увеличения пропускной способности.
Метод HEAD может сделать кэширование метода GET по тому же URI недействительным, когда результат запроса HEAD будет показывать, что закэшированные данные устарелиPOST - метод для отправки данных на сервер, часто вызывает изменения состояния сервера или side effects. Мы можем использовать данный метод, например, для того, чтобы создавать новые сущности на сервере. Иногда данный метод используется для получения данных, например, когда нам необходимо получить отфильтрованные данные, а размера URI не хватает, чтобы передать все фильтры корректно, а как мы говорили выше, то в методе GET нежелательно использовать тело запроса, и тут на помощь приходит метод POST, в который мы можем передать тело запроса и корректно получить данные, ну и конечно не стоит забывать про то, что метод GET лучше не использовать для передачи чувствительных данных(уж очень легко украсть).
Метод POST не является безопасным и идемпотентным, но он может быть кэшируемым, если будет соблюдено 1 условие для кэшируемых методов.PUT - метод, который используется для обновления или создания ресурса. Данный метод создает новое или заменяет старое представление ресурса данными, которые приходят в теле запроса.
Разница между PUT и POST заключается в том, что чаще всего PUT используется для редактирования ресурса, в то время, как метод POST отвечает за создание ресурса, именно такое поведение методов является семантически верным. Кроме этого разница этих методов еще и в том, что метод PUT является идемпотентным, а метод POST идемпотентным не является, пример именно с этими методами приведен выше, при пояснении идемпотентности.PATCH - метод, который используется для частичного редактирования ресурса. Как мы говорили выше, метод PUT также отвечает за изменение данных на сервере, так в чем же разница между методами PUT и PATCH? А разница заключается в том, что метод PUT полностью заменяет ресурс данными, представленными в теле запроса, в то время, как метод PATCH может заменить какие-то конкретные поля у данного ресурса.
Метод PATCH может быть идемпотентным при правильном использовании, а также может быть кэшируемым, но никогда не будет безопасным.DELETE - метод, который отвечает за удаление данных с сервера. Данный метод не является безопасным и кэшируемым, но является идемпотентным. Например, мы не можем удалить один и тот же ресурс с одинаковым идентификатором дважды.
Настало время приступить к менее известным методам. Итак, приступим.
OPTION - метод, который запрашивает информацию о возможностях и параметрах доступных методов на конкретном ресурсе. Если говорить проще, то метод OPTION задает следующий вопрос: "Что я могу делать с этим ресурсом?". Данный метод может дать информацию о том, какие методы применимы к ресурсы, какие заголовки можно передавать и тд. В случае, если в URI написана *, то данный запрос применяется ко всему методу.
Данный метод является безопасным и идемпотентным, но не является кэшируемым.CONNECT - метод, используемый для создания "тунеля" к серверу. Данный процесс можно описать следующим образом: отправляется запрос на создания соединения в котором указывается хост и порт, в случае, если прокси сервер одобряет соединение, то устанавливается связь с конечной точкой, после этого все соединение происходит через прокси.
TRACE - метод, который используется для диагностики и отладки. Принцип работы данного метода заключается в том, что отправляется запрос, а в ответ от сервера приходит тот же запрос, который мы отправили. Зачем это нужно? Например, нам необходимо понять, верно ли мы отправляем запрос, все заголовки к нему и тд. Также данный метод иногда используется для мониторинга и ведения логов, но данный метод используется редко, так как это может привести к проблемам с безопасностью, например, злоумышленник может украсть важные данные, например, куки, токены и тд. К слову данный метод является идемпотентным, но не является безопасным и кэшируемым.
Итого, мы разобрали все методы. Какие методы мы делаем?
- GET - скромный наблюдатель, может читать, но не может записывать.
- POST - создатель, даст данные, а там уже пусть что-то создастся.
- DELETE - ликвидатор, безвозвратное удаление, никак иначе.
- PUT - перфекционист, знает как должен выглядеть ресурс, если его нет, то нужно создать, а если есть, то нужно отредактировать.
- PATCH - хирург, точные изменения, никак иначе
- HEAD - это GET-запрос, который стесняется тела ответа.
- OPTION - как гид в ресторане: расскажет, какие "блюда" доступны для ресурса, но сам ничего не подаст.
Выбирайте методы с умом, и пусть ваш API никогда не узнает, что такое 500 ошибка!
Top comments (0)