Блог
  • Разработка

Методы GET и POST в HTTP

Один из самых используемых в сети протоколов — HTTP, изначально созданный только для передачи гипертекста. Несколько десятков лет назад его расширили для возможности передачи документов. Это привело к созданию библиотек, которые поддерживают работу с ним для всех распространённых языков программирования.

Одна из первых спецификаций HTTP версии 0.9 формально содержала в себе только метод GET.

В HTTP 1.0 в дополнение к GET появились методы HEAD, POST, DELETE, LINK и UNLINK. Причём GET оставили для получения сущности (документа), а POST предназначался для передачи этого документа серверу. И хотя последующие версии протокола определяли и другие методы, при использовании браузера для доступа к веб-сайтам методы GET и POST — одни из максимально часто используемых.

Как работает метод GET

GET-запросы применяют для получения информации от сервера, где URI запрашиваемого документа помещается после названия метода в запросе. Он получает любые данные, видимые клиентской стороне, среди которых изображения, видео и HTML-документы.

Начиная с версии HTTP 1.1, запрос иногда содержит некоторое количество заголовков, в которых может находиться дополнительная информация для сервера. Наиболее часто используемые заголовки: поддерживаемые клиентом языки (Accept-Language), URI предыдущего документа (Referer), соответствующий кнопке «Назад» в браузере, а также название и версия используемого клиента (User-Agent). GET-запрос не должен содержать тело, а сервер должен его игнорировать, если оно будет.

Метод GET не имеет побочных эффектов. Он идемпотентен — это означает, что многократное повторение запроса с GET эквивалентно однократному. Такое его качество даёт возможность кешировать ответы сервера, например, для снижения нагрузки на сеть.

Кроме того, можно применять GET для того, чтобы добавить данные формы (ключ — значение) к URL-адресу. Клиентской стороне необходимо лишь указать URL-адрес, для которого требуется доступ. Сервер получает запрос, обрабатывает и отправляет запрошенную информацию назад пользователю. Метод GET идеален для получения данных, безопасность которых не требуется.

Например, в Call Record API от МТС Exolve метод Download, применяемый для скачивания записи звонка, представляет собой GET-запрос.

Как работает метод POST

Запросы HTTP, использующие POST, применяют для передачи информации серверу или для обновления содержащихся там данных. Одним из наиболее частых сценариев применения метода POST в запросе является отправка данных заполненной пользователем формы на странице в браузере. Кроме этого, он довольно часто лежит в основе отправки сообщения на форум и загрузки файла на сайт.

Отправка формы может быть реализована как GET, так и POST-запросом. Но если применять GET, информация из формы может быть передана только как часть URI, а большинство ПО (HTTP: клиенты, прокси, сервера) на длину URI накладывают более жёсткие требования, чем на длину самого запроса.

В общем случае применение POST в запросе изменяет состояние сервера. А по сравнению с GET многократные POST-запросы не должны считаться повторной передачей одной и той же сущности. Например, движок форума при нескольких побайтно одинаковых POST-запросах должен опубликовать сообщение многократно.

Также POST может содержать параметры не только как часть URI, но и в теле запроса.

Например, в Call Record API от МТС Exolve метод SetCallRecordState, используемый для включения или отключения записи звонков, представляет собой POST, в котором одна часть параметров передаётся в заголовках запроса, а другая — в его теле, в JSON-формате.

Различия между GET и POST

Теперь, зная, как работают GET и POST, давайте посмотрим на различия между ними.

  • Видимость. При использовании GET мы должны указать параметры данных в URL-адресе, где они будут видны всем. И наоборот, метод POST требует от нас указания данных в теле HTTP-запроса, а не в URL-адресе. Следовательно, данные не видны.

  • Безопасность. Поскольку информация в URL-адресе открыта для всех, GET небезопасен. С другой стороны, POST обеспечивает безопасность, поскольку сохраняет параметры данных в теле HTTP-запроса, что предотвращает их попадание в закладки браузера. А так как POST-запросы не кешируются, данные не останутся в промежуточном прокси-сервере. Следовательно, он подходит для работы с теми из них, безопасность которых имеет значение.

  • Кеширование. Запросы GET можно кешировать. Это означает, что можно экономить трафик, время и уменьшать нагрузку на HTTP-сервер. Но это не относится к запросам POST, которые кешировать нельзя.

  • Состояние сервера. GET-запросы не могут менять данные на сервере, а лишь извлекают оттуда информацию. А используя POST-запросы, можно передавать данные на сервер для их обработки.

  • Объём передаваемых данных. Поскольку GET передаёт информацию через URL-адрес, её объём ограничен. В то время, как POST делает это в теле HTTP-запроса, позволяя передавать больше информации.

  • Тип данных. GET поддерживает только строковые данные, а POST — различные типы, включая числовые и двоичные.

  • Изменение состояния сервера. GET-запрос не изменяет состояния сервера. POST же может влиять на состояние сервера, так как он не идемпотентен. GET запрашивает данные из определённого ресурса, а POST может ещё запрашивать сервер создать или обновить ресурс.

  • Передача данных в HTTP. Поскольку во многих реализациях HTTP-серверов и HTTP-клиентов на длину URI наложены более строгие ограничения, чем на длину тела запроса, то передачу данных большой длины приходится осуществлять POST-запросом.

GET против POST: работа с отправкой формы

Хотя запросы GET и POST имеют разные функции, они оба служат одной и той же цели. Процесс отправки данных пользователем начинается одинаково для этих методов: когда форма заполняется и клиентская сторона отправляет информацию из формы на сервер.

Метод GET

После отправки формы метод GET создаёт URL-адрес с помощью атрибута действия, который передаёт тег формы и добавляет к нему данные, предоставленные клиентом.

Например:

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form action="page.php" method="GET">
<label for="fname">First name:</label>
<input type="text" id="fname" name="fname"><br><br>
<label for="lname">Last name:</label>
<input type="text" id="lname" name="lname"><br><br>
<input type="submit" value="Submit">
</form>
</body>
</html>

Метод POST

В POST после отправки формы клиентом используется атрибут действия для создания сообщения в соответствии с типом контента, указанным атрибутом enctype.

Например:

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form action="page.php" method="POST">
<label for="fname">First name:</label>
<input type="text" id="fname" name="fname"><br><br>
<label for="lname">Last name:</label>
<input type="text" id="lname" name="lname"><br><br>
<label for="pwd">Password:</label>
<input type="password" id="pwd" name="pwd">
<input type="submit" value="Submit">
</form>
</body>
</html>

Заключение

Кратко резюмируем преимущества и недостатки использования рассматриваемых методов.

При использовании GET легко получить запрошенные данные, он кеширует ответы браузера либо прокси-сервера, и можно легко вернуться к ним в любое время. Однако он не идеален для передачи конфиденциальной информации, поддерживает только строковый тип данных и ограничивает их длину. Кроме того, у него нет тела запроса, а параметры данных видны, поскольку они указаны в URL-адресе.

POST поддерживает передачу любых типов данных и позволяет помещать их в тело запроса, что актуально для конфиденциальной информации, а его запросы не кешируются.

Предыдущая статья
Оцените статью:
Следующая статья