HTTP ПОЧТА запросы предоставляют дополнительные данные от клиента (браузера) на сервер в теле сообщения. Напротив, ПОЛУЧИТЬ запросы включают в себя все необходимые данные в URL. Формы в HTML могут использовать любой метод, указав Метод = "POST" или Метод = "GET" (по умолчанию) в элемент. Указанный метод определяет способ отправки данных формы на сервер. Когда метод GET, все данные формы закодированы в URL, добавлены к действие URL как параметры строки запроса. При POST данные формы появляются в теле сообщения HTTP-запроса.
ПОЛУЧИТЬ | ПОЧТА | |
---|---|---|
история | Параметры остаются в истории браузера, потому что они являются частью URL | Параметры не сохраняются в истории браузера. |
BOOKMARKED | Можно добавить в закладки. | Не может быть в закладки. |
Кнопка НАЗАД / повторное представление поведения | GET-запросы повторно выполняются, но не могут быть повторно отправлены на сервер, если HTML хранится в кэше браузера.. | Браузер обычно предупреждает пользователя о необходимости повторной отправки данных. |
Тип кодирования (атрибут enctype) | применение / х-WWW-форм-urlencoded | multipart / form-data или application / x-www-form-urlencoded Использовать многочастное кодирование для двоичных данных. |
параметры | Можно отправить, но данные параметров ограничены тем, что мы можем вставить в строку запроса (URL). Безопаснее всего использовать менее 2K параметров, некоторые серверы обрабатывают до 64K | Может отправлять параметры, включая загрузку файлов, на сервер. |
Взломанный | Проще взломать для сценария детишек | Труднее взломать |
Ограничения на тип данных формы | Да, разрешены только символы ASCII. | Нет ограничений. Двоичные данные также разрешены. |
Безопасность | GET менее безопасен по сравнению с POST, потому что отправленные данные являются частью URL. Таким образом, он сохраняется в истории браузера и журналах сервера в виде открытого текста.. | POST немного безопаснее, чем GET, потому что параметры не сохраняются в истории браузера или в журналах веб-сервера.. |
Ограничения на длину данных формы | Да, поскольку данные формы указаны в URL-адресе, а длина URL-адреса ограничена. Безопасное ограничение длины URL-адреса часто составляет 2048 символов, но зависит от браузера и веб-сервера.. | Нет ограничений |
Юзабилити | Метод GET не должен использоваться при отправке паролей или другой конфиденциальной информации. | Метод POST, используемый при отправке паролей или другой конфиденциальной информации. |
видимость | Метод GET виден всем (он будет отображаться в адресной строке браузера) и имеет ограничения на количество отправляемой информации.. | Переменные метода POST не отображаются в URL. |
Сохраненная копия | Можно кэшировать | Не кэшируется |
Принципиальная разница между METHOD = "GET" и METHOD = "POST" является то, что они соответствуют разные HTTP-запросы, как определено в спецификациях HTTP. Процесс отправки для обоих методов начинается одинаково - набор данных формы создается браузером и затем кодируется способом, указанным ENCTYPE атрибут. За METHOD = "POST ENCTYPE атрибут может быть многочастному / форм-данных, или применение / х-WWW-форм-urlencoded, тогда как для METHOD = "GET", только применение / х-WWW-форм-urlencoded разрешено. Этот набор данных формы затем передается на сервер.
Для отправки формы с METHOD = "GET" браузер создает URL, принимая значение действие атрибут, добавление ? затем добавляем набор данных формы (закодированный с использованием типа содержимого application / x-www-form-urlencoded). Затем браузер обрабатывает этот URL-адрес, как если бы он переходил по ссылке (или как если бы пользователь вводил URL-адрес напрямую). Браузер разделяет URL-адрес на части и распознает хост, а затем отправляет этому хосту запрос GET с оставшейся частью URL в качестве аргумента. Сервер берет это оттуда. Обратите внимание, что этот процесс означает, что данные формы ограничены кодами ASCII. Особое внимание следует уделить кодированию и декодированию символов других типов при передаче их через URL в формате ASCII..
Отправка формы с METHOD = "POST" вызывает отправку запроса POST, используя значение действие атрибут и сообщение, созданные в соответствии с типом содержимого, указанным ENCTYPE атрибут.
Поскольку данные формы отправляются как часть URL, когда ПОЛУЧИТЬ используется --
В принципе обработка данных отправленной формы зависит от того, METHOD = "GET" или METHOD = "POST". Поскольку данные кодируются по-разному, необходимы разные механизмы декодирования. Таким образом, вообще говоря, изменение МЕТОДА может потребовать изменения в сценарии, который обрабатывает представление. Например, при использовании интерфейса CGI сценарий получает данные в переменной среды (QUERYSTRING), когда ПОЛУЧИТЬ используется. Но когда ПОЧТА данные формы передаются в стандартный поток ввода (STDIN) и количество байтов для чтения дается заголовком Content-length.
GET рекомендуется при отправке «идемпотентных» форм - тех, которые «существенно не меняют состояние мира». Другими словами, формы, которые включают только запросы к базе данных. С другой стороны, несколько идемпотентных запросов будут иметь тот же эффект, что и один запрос. Если обновления базы данных или другие действия, такие как запуск электронных писем связаны, рекомендуется использовать POST.
Из блога разработчиков Dropbox:
браузер не знает точно, что делает конкретная HTML-форма, но если форма отправляется через HTTP GET, браузер знает, что безопасно автоматически повторить отправку в случае сетевой ошибки. Для форм, использующих HTTP POST, повторная попытка может быть небезопасной, поэтому браузер сначала запрашивает у пользователя подтверждение.
Запрос «GET» часто кэшируется, тогда как запрос «POST» вряд ли может быть. Для систем запросов это может оказать значительное влияние на эффективность, особенно если строки запросов просты, поскольку кеши могут обслуживать наиболее частые запросы..
В некоторых случаях, используя ПОЧТА рекомендуется даже для идемпотентных запросов:
Обновлено 15 мая 2015 г. В частности, при использовании HTTPS (HTTP поверх TLS / SSL) POST обеспечивает большую безопасность, чем GET?
Это интересный вопрос. Скажем, вы делаете запрос GET на веб-страницу:
ПОЛУЧИТЕ https://www.example.com/login.php?user=mickey&passwd=mini
Предполагая, что ваше интернет-соединение контролируется, какая информация об этом запросе будет доступна для снуппера? Если вместо этого используется POST, а данные пользователя и passwd включены в переменные POST, это будет более безопасно в случае соединений HTTPS?
Ответ - нет. Если вы сделаете такой запрос GET, злоумышленнику, отслеживающему ваш веб-трафик, будет известна только следующая информация:
Часть пути URL-адреса, т. Е. Фактическая запрашиваемая страница, а также параметры строки запроса защищены (зашифрованы), пока они находятся «по проводам», т. Е. В пути по пути к целевому серверу. Ситуация точно такая же для запросов POST.
Конечно, веб-серверы имеют тенденцию регистрировать весь URL в виде простого текста в своих журналах доступа; поэтому отправка конфиденциальной информации через GET не очень хорошая идея. Это применяется независимо от того, используется ли HTTP или HTTPS.