Перейти к содержимому

Методы HTTP

HTTP (Hypertext Transfer Protocol) был создан для обеспечения взаимодействия между клиентами и сервером. Он работает по модели «запрос-ответ».

Существует два основных метода HTTP: GET и POST.

Метод GET

Метод GET запрашивает данные из указанного источника. Запросы GET могут кэшироваться и сохраняться в истории браузера. Их также можно добавлять в закладки.

Его никогда не следует использовать для передачи конфиденциальных данных. Запросы GET имеют ограничения по длине, и их следует использовать только для получения данных.

DANGER

Строки запроса (пары «имя/значение») отправляются в URL запроса GET.

Пример текстового поля ввода с методом get

html
<!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"

html
<!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

ХарактеристикаGETPOST
Кнопка «Назад» / ОбновлениеБезопасноПри обновлении страницы данные формы будут отправлены повторно. Браузер должен предупредить пользователя о повторной отправке данных в этом случае.
Можно добавить в закладкиДаНет
Можно кэшироватьДаНет
Тип кодированияapplication/x-www-form-urlencodedapplication/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

http
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
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

http
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
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?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.