Skip to content

Latest commit

 

History

History
138 lines (90 loc) · 13.4 KB

2.3.1.4 HTTP_Methods.md

File metadata and controls

138 lines (90 loc) · 13.4 KB

Какие различия между HEAD, GET, POST, PUT?

  1. Mozilla HTTP

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:

Некорректная реализация метода 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 - запрос информации о ресурсе

Используется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса. Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа ?:

GET /path/resource?param1=value1&param2=value2 HTTP/1.1

Метод HEAD - запрос заголовков ресурса

Аналогичен методу GET, за исключением того, что в ответе сервера отсутствует тело. Запрос HEAD обычно применяется для извлечения метаданных, проверки наличия ресурса (валидация URL) и чтобы узнать, не изменился ли он с момента последнего обращения. Заголовки ответа могут кэшироваться. При несовпадении метаданных ресурса с соответствующей информацией в кэше копия ресурса помечается как устаревшая.

Метод POST - запрос на создание ресурса

Применяется для передачи пользовательских данных заданному ресурсу. Например, в блогах посетители обычно могут вводить свои комментарии к записям в 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()

Метод PUT - обновляет ресурс полностью

Применяется для загрузки содержимого запроса на указанный в запросе URI. Если по заданному URI не существовало ресурса, то сервер создаёт его и возвращает статус 201 (Created). Если же был изменён ресурс, то сервер возвращает 200 (Ok) или 204 (No Content). Сервер не должен игнорировать некорректные заголовки Content-*, передаваемые клиентом вместе с сообщением. Если какой-то из этих заголовков не может быть распознан или не допустим при текущих условиях, то необходимо вернуть код ошибки 501 (Not Implemented). Фундаментальное различие методов POST и PUT заключается в понимании предназначений URI ресурсов. Метод POST предполагает, что по указанному URI будет производиться обработка передаваемого клиентом содержимого. Используя PUT, клиент предполагает, что загружаемое содержимое соответствует находящемуся по данному URI ресурсу.

Put And Patch HTTP Methods

Метод DELETE

Если нам необходимо удалить неправильно сформированный заказ в интернет-магазине, пользователя в социальной сети или фотографию в 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