HTTP поддерживает 9 методов запросов, каждый из которых выполняет определенную функцию:
- GET - запрос информации о ресурсе;
- HEAD - запрос заголовков ресурса (аналогичен методу GET, но без получения тела ответа);
- POST - запрос на создание ресурса (например, регистрация пользователя);
- PUT - запрос на обновление ресурса (обновляет ресурс полностью);
- PATCH - запрос на обновление ресурса (частично обновляет ресурс);
- DELETE - запрос на удаление ресурса;
- OPTIONS - запрос информации о поддерживаемых методах у ресурса (в заголовке Allow представляются поддерживаемые методы);
- CONNECT - преобразование соединения в прозрачный TCP/IP-туннель, например, для соединения с сайтом через SSL;
- TRACE - позволяет клиенту видеть, что происходит на каждом этапе между клиентом и сервером;
На практике чаще всего используются первые пять методов HTTP (GET, POST, PUT, PATCH, DELETE) для реализации так называемого акронима CRUD
(Create, Read, Update, Delete). В его рамках:
- Метод GET реализует букву R (Read - читать).
- Метод POST реализует букву C (Create - создавать).
- Методы PUT и PATCH реализуют букву U (Update - обновлять).
- Метод DELETE реализует букву D (Delete - удалять).
❗ Cо статусами-кодов и тела ответа от сервера можно ознакомиться здесь.
Идемпотентные методы которые либо не изменяют состояние в базе данных, либо изменяют состояние только при первом запросе. В случае повторной отправки идентичного запроса, состояние в базе данных не изменяется.
Идемпотентными методами являются: GET, PUT, DELETE, HEAD и OPTIONS/TRACE. POST, PATCH и CONNECT не входят в эту группу.
Безопасные методы - это методы, которые не изменяют состояние в базе данных (read only методы). Примечательно, что все безопасные методы также являются идемпотентными.
Безопасными методами являются: GET, HEAD и OPTIONS/TRACE
Отличие идемпотентных методов от безопасных заключается%
-
безопасные методы не меняют состояние базы данных (БД)
-
идемпотентные методы могут внести изменения при 1м запросе, но последующие идентичные запросы уже не будут менять состояние в БД.
Пример №1: нарушение идемпотентности методов.
Идемпотентная реализация метода DELETE:
- при первом запросе на удаление http://example.com/users/5 вернулся 204 No Content
- дальнейшая повторная отправка аналогичного запроса возвращает 404 Not Found.
Некорректная реализация метода DELETE:
- каждый запрос на удаление http://example.com/users удаляет последнего зарегистрированного пользователя, а не конкретный ресурс по указанному URI.
Это приводит к тому, что состояние сервера изменяется при каждом запросе, так как каждый запрос удаляет другого пользователя. Таким образом, метод DELETE не является идемпотентным в данной реализации.
Пример №2: нарушение безопасности методов.
Безопасная реализация метода GET: при отправке GET запроса http://example.com/users/5/balance возвращается баланс пользователя с id=5.
Реализация метода GET с нарушением безопасности метода: разработчики реализовали query-параметр update_balance
и теперь клиент может обновлять свой баланс отправляя http://example.com/users/5/balance?update_balance=10.
В данном примере нарушена безопасность метода GET, так как клиент меняет состояние на серверной стороне при первом запросе. При этом здесь не нарушена идемпотентность, так как повторная отправка аналогичного запроса не будет менять баланс.
Пример №3: нарушение безопасности и идемпотентности методов.
Реализация метода GET: разработчики реализовали query-параметры plus и minus. Теперь клиент может увеличить свой баланс отправляя http://example.com/users/5/balance?plus=10 и уменьшить свой баланс отправляя http://example.com/users/5/balance?minus=10.
В данном примере нарушена и безопасность, и идемпотентность метода GET, так как клиент меняет состояние на серверной стороне при каждом запросе.
Таблица безопасных и идемпотентных методов:
GET | POST | PUT | PATCH | DELETE | |
---|---|---|---|---|---|
Безопасный | + | - | - | - | - |
Идемпотентный | + | - | + | - | + |
Используется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса. Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа ?:
GET /path/resource?param1=value1¶m2=value2 HTTP/1.1
Аналогичен методу GET
, за исключением того, что в ответе сервера отсутствует тело. Запрос HEAD
обычно применяется для извлечения метаданных, проверки наличия ресурса (валидация URL) и чтобы узнать, не изменился ли он с момента последнего обращения. Заголовки ответа могут кэшироваться. При несовпадении метаданных ресурса с соответствующей информацией в кэше копия ресурса помечается как устаревшая.
Применяется для передачи пользовательских данных заданному ресурсу. Например, в блогах посетители обычно могут вводить свои комментарии к записям в HTML-форму, после чего они передаются серверу методом POST
и он помещает их на страницу. При этом передаваемые данные (в примере с блогами — текст комментария) включаются в тело запроса. Аналогично с помощью метода POST
обычно загружаются файлы на сервер. В отличие от метода GET
, метод POST
не считается идемпотентным, то есть многократное повторение одних и тех же запросов POST
может возвращать разные результаты (например, после каждой отправки комментария будет появляться одна копия этого комментария).
var request = URLRequest(url: URL(string: "http://www.thisismylink.com/postName.php")!)
request.httpMethod = "POST"
let postString = "id=13&name=Jack"
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
// check for fundamental networking error
print("error=\(error)")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
// check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}
let responseString = String(data: data, encoding: .utf8)
print("responseString = \(responseString)")
}
task.resume()
Применяется для загрузки содержимого запроса на указанный в запросе URI. Если по заданному URI не существовало ресурса, то сервер создаёт его и возвращает статус 201 (Created). Если же был изменён ресурс, то сервер возвращает 200 (Ok) или 204 (No Content). Сервер не должен игнорировать некорректные заголовки Content-*, передаваемые клиентом вместе с сообщением. Если какой-то из этих заголовков не может быть распознан или не допустим при текущих условиях, то необходимо вернуть код ошибки 501 (Not Implemented). Фундаментальное различие методов POST
и PUT
заключается в понимании предназначений URI ресурсов. Метод POST
предполагает, что по указанному URI будет производиться обработка передаваемого клиентом содержимого. Используя PUT
, клиент предполагает, что загружаемое содержимое соответствует находящемуся по данному URI ресурсу.
Если нам необходимо удалить неправильно сформированный заказ в интернет-магазине, пользователя в социальной сети или фотографию в Instagram, мы используем метод DELETE. Метод DELETE может иметь тело запроса, но также может и не иметь, но как правило, тело запроса в методе DELETE не используется.
Пример DELETE запроса, на удаление пользователя с id=123:
DELETE /users/123 HTTP/1.1
Host: example.com
Как и метод PUT, метод DELETE не поддерживает кэширование.
2.3.1.3 URI URL URN Theme | Back To iOSWiki Contents | 2.3.1.5 Response Status Code Theme