Методы HTTP
HTTP (Hypertext Transfer Protocol) был создан для обеспечения взаимодействия между клиентами и сервером. Он работает по модели «запрос-ответ».
Существует два основных метода HTTP: GET и POST.
Метод GET
Метод GET запрашивает данные из указанного источника. Запросы GET могут кэшироваться и сохраняться в истории браузера. Их также можно добавлять в закладки.
Его никогда не следует использовать для передачи конфиденциальных данных. Запросы GET имеют ограничения по длине, и их следует использовать только для получения данных.
DANGER
Строки запроса (пары «имя/значение») отправляются в URL запроса GET.
Пример текстового поля ввода с методом get
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
</head>
<body>
<form action="/form/submit" method="get">
First name:
<input type="text" name="username" placeholder="Your name" />
<br />
<br />
<input type="submit" value="Submit" />
</form>
</body>
</html>Метод POST
Метод POST отправляет данные для обработки в указанный источник. В отличие от метода GET, запросы POST никогда не кэшируются, не сохраняются в истории браузера и не могут быть добавлены в закладки. Кроме того, запросы POST не ограничены длиной URL, хотя серверы обычно устанавливают собственные ограничения на размер тела запроса.
DANGER
Строки запроса (пары «имя/значение») отправляются в теле HTTP-сообщения запроса POST.
Пример формы с методом "post"
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
</head>
<body>
<form action="/form/submit" method="post">
First name:
<input type="text" name="username" placeholder="Your name" />
<br /><br />
<input type="submit" value="Submit" />
</form>
</body>
</html>Сравнение методов GET и POST
| Характеристика | GET | POST |
|---|---|---|
| Кнопка «Назад» / Обновление | Безопасно | При обновлении страницы данные формы будут отправлены повторно. Браузер должен предупредить пользователя о повторной отправке данных в этом случае. |
| Можно добавить в закладки | Да | Нет |
| Можно кэшировать | Да | Нет |
| Тип кодирования | application/x-www-form-urlencoded | application/x-www-form-urlencoded или multipart/form-data |
| История | Сохраняется в истории браузера. | Не сохраняется в истории браузера. |
| Ограничения длины данных | При отправке данных метод GET добавляет их в URL. Длина URL ограничена (максимальная длина URL составляет 2048 символов). | Не имеет ограничений по длине URL, хотя серверы обычно устанавливают собственные ограничения на размер тела запроса. |
| Ограничения типа данных | В основном символы ASCII, хотя поддержка UTF-8 возможна через процентное кодирование. | Ограничений нет. Также допускается двоичные данные. |
| Безопасность | Менее безопасен, чем POST, так как отправляемые данные являются частью URL. | POST более безопасен, чем GET, так как данные не видны в URL или истории браузера. Однако оба метода передают данные в открытом виде по HTTP и требуют HTTPS для обеспечения реальной безопасности. |
| Видимость | Данные видны всем в URL. | Данные не отображаются в URL. |
Note
Нативно HTML-формы поддерживают только методы
GETиPOST. Для использованияPUT,PATCHилиDELETEс формами обычно требуется JavaScript или маршрутизация на стороне сервера для имитации этих методов.
Другие методы HTTP-запросов
Помимо методов GET и POST, существуют и другие методы. См. их ниже:
| Метод | Описание |
|---|---|
| HEAD | Аналогичен методу GET, но возвращает только HTTP-заголовки, а не тело документа. |
| OPTIONS | Возвращает методы HTTP, которые поддерживает сервер. |
| CONNECT | Преобразует соединение запроса в прозрачный туннель TCP/IP. |
Метод PUT
Метод PUT в основном используется для операций обновления. Иными словами, с помощью этого метода мы указываем URL целевого ресурса вместе с телом запроса, которое содержит представление исходного ресурса, которое было недавно обновлено. Этот метод также может использоваться для создания ресурса, когда идентификатор ресурса выбирает клиент, а не сервер.
Следует учитывать, что PUT не считается безопасным методом, поскольку он может создавать или изменять состояние на сервере, но он является идемпотентным. Это означает, что если вы создадите или измените ресурс с помощью этого метода, а затем выполните тот же запрос второй раз, ресурс останется в том же состоянии, что и после первого вызова.
В приведенном ниже примере запрашивается сохранение заданного тела запроса в файле method.py в корневом каталоге сервера:
Пример метода PUT
PUT /method.py HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.w3docs.com
Accept-Language: en-us
Connection: Keep-Alive
Content-Type: text/html
Content-Length: 160После сохранения заданного тела запроса в файле сервер отправит следующий ответ:
Пример ответа метода PUT
HTTP/1.1 201 Created
Date: Tue, 13 Dec 2019 14:53:57 GMT
Server: Apache/2.2.14 (Win32)
Content-Type: text/html
Content-length: 40
Connection: ClosedМетод PATCH
Метод PATCH в основном используется для операций модификации. Ему не требуется весь ресурс целиком. Он должен содержать только изменения, вносимые в ресурс. Этот метод не является ни идемпотентным, ни безопасным. Столкновения между двумя запросами PATCH могут быть очень опасными, поскольку некоторые форматы патчей требуют выполнения операции от общей базовой точки; в противном случае ресурс будет поврежден.
Метод DELETE
Как можно догадаться, этот метод используется для удаления ресурса, идентифицированного URL. Этот метод также является идемпотентным. При удалении ресурса он удаляется. Многократный вызов DELETE дает один и тот же результат — ресурс остается удаленным.
В приведенном ниже примере запрашивается удаление файла method.py в корневом каталоге сервера:
Запрос метода DELETE
DELETE /method.py HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.w3docs.com
Accept-Language: en-us
Connection: Keep-AliveПосле удаления файла сервер отправит следующий ответ:
Ответ метода DELETE
HTTP/1.1 200 OK
Date: Tue, 13 Dec 2019 14:53:57 GMT
Server: Apache/2.2.14 (Win32)
Content-Type: text/html
Content-length: 20
Connection: ClosedПрактика
Какие из перечисленных являются допустимыми методами HTTP согласно содержанию предоставленного URL?