Методы GET и POST в HTTP и HTTPS — два самых популярных метода, используемых для передачи данных с клиента на сервер с использованием протокола HTTP (протокол передачи гипертекста). И GET, и POST могут использоваться для отправки запроса и получения ответа, но между ними существует значительная разница.
Разница между запросами GET и POST в HTTP или HTTPS - популярный вопрос на каждом интервью по веб-программированию. Поскольку HTML не зависит от технологии веб-сервера, такой как Java, ASP или PHP и HTTP — это основной протокол в пространстве Интернета, нельзя четко игнорировать важность понимания методов GET и POST. В этой статье мы рассмотрим, что такое HTTP-метод GET, что такое HTTP-метод POST, когда использовать тот или иной запрос и какова разница между ними. Разберем каждое понятие отдельно.
Что такое HTML?
HTML — это язык, используемый для создания веб-страниц. Гипертекст относится к гиперссылкам, которые может содержать HTML-страница. Язык разметки означает способ использования тегов для определения макета страницы и элементов на странице. Ниже приведен пример HTML, который используется для определения базовой веб-страницы с заголовком и одним абзацем текста:
Первая строка определяет тип содержимого, содержащегося в документе. ,
и , которые все включены в пример выше. Заголовок страницы, метаданные и ссылки на файлы с привязкой помещаются между Фактическое содержимое страницы находится между тегами .
За последние несколько десятилетий сеть пережила множество изменений, но HTML всегда был основным языком, используемым для разработки веб-страниц. Интересно, что хотя веб-сайты стали более продвинутыми и интерактивными, HTML стал проще. Если вы сравниваете источник страницы HTML5 с аналогичной страницей, написанной в HTML 4.01 или XHTML 1.0, на странице HTML5 будет меньше кода. Это связано с тем, что современный HTML опирается на каскадные таблицы стилей или JavaScript для форматирования почти всех элементов внутри страницы.
Многие динамические веб-сайты генерируют веб-страницы «на лету», используя серверный язык сценариев, такой как PHP или ASP. Однако даже динамические страницы должны быть отформатированы с использованием HTML. Поэтому языки сценариев часто генерируют HTML-код, который отправляется в веб-браузер.
Протокол передачи гипертекста HTTP предназначен для взаимодействия между клиентами и серверами и работает как протокол запроса-ответа.
Веб-браузер может быть клиентом, а приложение на компьютере, на котором размещен веб-сайт, — сервером.
Клиент (браузер) отправляет HTTP-запрос серверу, сервер возвращает ответ, который содержит информацию о состоянии запроса и может также содержать запрошенный контент.
Два метода запросов GET и POST
Два часто используемых метода для запроса-ответа между клиентом и сервером:
GET - запрашивает данные из указанного ресурса;
POST - отправляет данных, подлежащие обработке, на указанный ресурс.
Перевод GET и POST в буквальном смысле означает получение и постобработку.
Подробнее об HTTP
HTTP — это протокол, используемый для передачи данных через Интернет. Является частью пакета интернет-протокола и определяет команды и службы, используемые для передачи данных веб-страницы.
HTTP использует модель server-client. Клиент может быть домашним компьютером, ноутбуком или мобильным устройством. HTTP-сервер, как правило, является веб-хостом с программным обеспечением веб-сервера, таким как Apache или IIS. Когда пользователь получает доступ к веб-сайту, браузер отправляет запрос на соответствующий веб-сервер и отвечает кодом состояния HTTP. Если URL-адрес действителен и соединение предоставлено, сервер отправит браузеру веб-страницу и связанные файлы.
Общие коды состояния HTTP включают:
200 — успешный запрос (существует веб-страница);
301 — перемещается постоянно (часто перенаправляется на новый URL-адрес);
HTTP определяет команды GET и POST, которые используются для обработки представлений форм на веб-сайтах. Команда CONNECT используется для облегчения безопасного соединения, которое шифруется с использованием SSL. Зашифрованные HTTP-соединения происходят через HTTPS — расширение HTTP, предназначенное для защищенных передач данных.
URL-адреса, начинающиеся с «http://», доступны по стандартным протоколам передачи гипертекста и по умолчанию используют порт 80. URL-адреса, начинающиеся с «https://», доступны через безопасное соединение HTTPS и часто используют порт 443.
POST
POST — это серия системных проверок, выполняемых компьютерами и другими электронными устройствами при их включении. Результаты теста могут отображаться на экране, выводиться через мигающие светодиоды или просто записываться внутри. В компьютерных системах операция POST выполняется в начале последовательности загрузки. Если все тесты пройдены, остальная часть процесса запуска будет продолжена автоматически.
Операционные системы устройств Mac и Windows запускают POST каждый раз, когда компьютер загружается или перезапускается. Сканирование проверяет аппаратное обеспечение и гарантирует, что процессор, ОЗУ и устройства хранения данных будут работать правильно. Если во время выполнения POST возникла ошибка, процесс запуска может приостановиться или полностью прекратиться, а на мониторе может появиться сообщение о На ПК ошибки POST часто отображаются на экране информации о BIOS. Они могут выводиться как криптовые коды, такие как «08», или как системное сообщение, например, «Ошибка системной памяти при смещении». На Mac ошибки POST часто обозначаются простой графикой, например, сломанной иконкой папки, которая указывает, что загрузочное устройство не найдено.
Физические проявления
В некоторых случаях экран компьютера может даже не включаться перед ошибками POST. Если это произойдет, коды ошибок могут выводиться через мигающие светодиодные индикаторы или звуковые сигналы. Например, Apple iMac будет воспроизводить три последовательных тона, выдерживать паузу в пять секунд, а затем повторять тоны, когда во время запуска обнаруживается плохая ОЗУ. Большинство ПК также издают звуковые сигналы при обнаружении ошибок POST, хотя каждый производитель использует свои собственные коды.
POST — довольно технический термин, который используют только компьютерные техники на регулярной основе. Однако это хорошая аббревиатура, поскольку помогает лучше понять сообщения об ошибках, которые могут появиться на компьютерах или других электронных устройствах. Если компьютер не запускается из-за ошибки POST, можно использовать другое устройство для поиска значения и причины ошибки с веб-сайта производителя. Затем можно предпринять соответствующие действия — удаление модуля памяти или повторную установку видеокарты с последующим перезапуском оборудования.
GET
POST также является методом передачи переменных формы HTML с одной веб-страницы на другую, не отображая их в адресной строке. Альтернативный метод — GET, который добавляет значения в URL. Запросы HTTP POST предоставляют дополнительные данные от клиента (браузера) на сервер в теле сообщения. Напротив, запросы GET включают все необходимые данные в URL. Формы в HTML могут использовать любой метод, указав метод = POST или method = GET (по умолчанию) в элементе
У формы есть атрибуты, перечислю самые распространенные:
Давайте создадим форму:
В качестве файла обработчика я поставил файл test.php
так как именно в нем пишу для Вас примеры. Метод отправки я поставил post так как именно этим методам пользуются в 99.9% случаях. Так же я присвоил нашей форме имя — form
Теперь окунемся в мир элементов формы. Первым делом Вы должны понять, что почти все элементы являются тегом отличие лишь в атрибуте type
у этих тегов. Давайте я перечислю используемые элементы форм:
Я уверен, что вы не раз встречали такие поля, так что тут как говорится: «no comments»
Теперь давайте составим небольшую тренировочную анкету, с которой будем работать далее. Наша задача составить небольшую анкетку которая поведает нам имя заполнявшего, пол, из какой он страны, любимый цвет и поле текста где пользователь может добавить что-нить о себе. Вот что у меня получилось:
Сохранив данный код в HTML-файле и просмотрев его с помощью вашего любимого браузера, вы увидите привычную HTML-форму:
Тэг
, собственно и задает форму. Его атрибуты - оба необязательные:
action - указывает URL (полный или относительный), на который будет отправлена форма.
Если этот атрибут не указать, большинство браузеров (точнее говоря, все известные мне браузеры)
отправляют форму на текущий документ, то есть "саму на себя". Это удобное сокращение, но по стандарту
HTML атрибут action обязателен.
method - способ отправки формы. Их два.
GET - отправка данных формы в адресной строке.
Вы могли заметить на различных сайтах присутствие в конце URL символа "?" и следующих за ним данных
в формате параметр=значение. Здесь "параметр" соответствует значению атрибута
name элементов формы (см. ниже про тэг ), а "значение" -
содержимому атрибута value (в нем, например, содержится ввод пользователя в текстовое
поле того же тэга ).
Для примера - попробуйте поискать что-нибудь в Яндексе и обратите внимание на адресную строку браузера.
Это и есть способ GET.
POST - данные формы отправляются в теле запроса. Если не совсем понятно (или совсем
непонятно), что это такое - не беспокойтесь, скоро мы к этому вопросу вернемся.
Если атрибут method не указан - подразумевается GET .
Тэг - задает элемент формы, определяемый атрибутом type:
Значение "text" задает однострочное текстовое поле ввода
Значение "submit" задает кнопку, при нажатии которой происходит отправка формы на сервер
Возможны и другие значения (да и - не единственный тэг, задающий элемент формы).
Итак, что же происходит, когда мы нажимаем кнопку "OK"?
Браузер просматривает входящие в форму элементы и формирует из их атрибутов name и value данные формы.
Допустим, введено имя Vasya . В этом случае данные формы - name=Vasya&okbutton=OK
Браузер устанавливает соединение с сервером, отправляет на сервер запрос документа, указанного в
атрибуте action тэга
Сервер анализирует полученный запрос, формирует ответ, отправляет его браузеру и закрывает соединение
Браузер отображает полученный от сервера документ
Отправка того же запроса вручную (с помошью telnet) выглядит следующим образом (предположим, что доменное имя сайта - www.example.com):
Telnet www.example.com 80
GET /cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK HTTP/1.0\r\n
Host: www.example.com\r\n
\r\n
Как вы, скорее всего, уже догадались, нажатие submit-кнопки в форме с методом отправки "GET" аналогично вводу соответствующего URL (со знаком вопроса и данными формы в конце) в адресной строке браузера:
На самом деле, метод GET используется всегда, когда вы запрашиваете с сервера какой-либо документ, просто введя его URL, или щелкнув по ссылке. При использовании
Форма, приведенная в строках 8-12, содержит два элемента: name и okbutton . Атрибут method указывает метод отправки формы POST , атрибут же action , указывающий URL, на который отправляется форма, заполняется значением серверной переменной PHP_SELF - адресом выполняемого в данный момент скрипта.
=$_SERVER["PHP_SELF"]?> - сокращенная форма записи для echo $_SERVER["PHP_SELF"]; ?> .
Предположим, в поле name мы ввели значение Вася, и нажали кнопку OK. При этом браузер отправляет на сервер POST -запрос. Тело запроса: name=Вася&okbutton=OK . PHP автоматически заполняет массив $_POST:
В действительности, значение "Вася" отправляется браузером в urlencode-виде; для кодировки windows-1251 это значение выглядит как %C2%E0%F1%FF . Но, поскольку PHP автоматически осуществляет необходимое декодирование, мы можем "забыть" об этой особенности - пока не придется работать с HTTP-запросами вручную.
Так как в теле запроса указываются только имена и значения, но не типы элементов форм, PHP понятия не имеет, соответствует $_POST["name"] строке ввода, кнопке, или списку. Но эта информация нам, в общем-то, совершенно не нужна. :)
Поскольку знать, что написано на кнопке submit, нам необязательно, в строке 11 можно удалить атрибут name , сократив описание кнопки до . В этом случае, браузер отправит POST -запрос name=Вася.
А теперь - то же самое, но для GET-формы:
if (isset($_GET
[
"name"
])) {
echo
"
Привет, "
.
$_GET
[
"name"
] .
"
!"
;
}
?>
В строке 8 можно было бы с таким же успехом написать
Никаких новых приемов здесь не используется. Разберитесь, выполните код, попробуйте модифицировать...
Изменим последний пример, чтобы пользователю не нужно было повторно заполнять поля. Для этого заполним атрибуты value элементов формы только что введенными значениями.
Может возникнуть вопрос - почему бы не выбросить строки 4-5 и не написать:
Введите Ваше имя:
">
Введите Ваш год рождения:
">
Дело в том, что, если эти POST -переменные не определены - а так и будет, если форму еще не заполняли, - PHP выдаст предупреждения об использовании неинициализированных переменных (причем, вполне обоснованно: такое сообщение позволяет быстро находить труднообнаружимые опечатки в именах переменных, а также предупреждает о возможных "дырах" на сайте). Можно, конечно, поместить код с isset прямо в форму, но получится слишком громоздко.
Разобрались? А теперь попробуйте найти ошибку в приведенном коде. Ну, не совсем ошибку, - но недочет.
htmlspecialchars()
Не нашли? Я подскажу. Введите, например, в поле "имя" двойную кавычку и какой-нибудь текст, например, Ва"ся. Отправьте форму, и взгляните на исходный код полученной страницы. В четвертой строке будет что-то наподобие:
Введите Ваше имя:
То есть - ничего хорошего. А если бы хитрый пользователь ввел JavaScript-код?
Для решения этой проблемы необходимо воспользоваться функцией htmlspecialchars() , которая заменит служебные символы на их HTML-представление (например, кавычку - на "):
Повторите опыт и убедитесь, что теперь HTML-код корректен.
Запомните - функцию htmlspecialchars() необходимо использовать всегда, когда выводится содержимое переменной, в которой могут присутствовать спецсимволы HTML.
phpinfo()
Функция phpinfo() - одна из важнейших в PHP. Она выводит информацию о настройках PHP, значения всевозможных конфигурационных переменных...
Почему я упоминаю о ней в статье, посвященной формам? phpinfo() - удобнейшее средство отладки. phpinfo() , помимо прочего, выводит значения всех $_GET , $_POST и $_SERVER переменных. Так что, если переменная формы "потерялась", самый простой способ обнаружить, в чем дело - воспользоваться функцией phpinfo() . Для того, чтобы функция выводила только значения переменных (и вам не пришлось прокручивать десяток страниц), ее следует вызвать следующим образом: phpinfo(INFO_VARIABLES); , или - что абсолютно то же самое - phpinfo(32) ;.
phpinfo
(32
);
?>
Или, например, такая ситуация: вы хотите узнать IP-адрес посетителя. Вы помните, что соответствующая переменная хранится в массиве $_SERVER , но - вот незадача - забыли, как именно переменная называется. Опять же, вызываем phpinfo(32); , ищем в табличке свой IP-адрес и находим его - в строке $_SERVER["REMOTE_ADDR"] .
Этот пост предназначен для объяснения принципов передачи данных в интернете с помощью двух основных методов: GET и POST. Написал я его в качестве дополнения к инструкции по генератору сменного графика работы для тех, кому вряд ли интересны подробности ☺.
Перейдите по следующему адресу (это для наглядного объяснения): http://calendarin.net/calendar.php?year=2016 Обратите внимание на адресную строку браузера: calendarin.net/calendar.php?year=2016
Основной файл называется, за ним следует вопросительный знак (?) и параметр «year» со значением «2016». Так вот, всё, что следует за вопросительным знаком, это и есть GET-запрос. Всё просто. Чтобы передать не один параметр, а несколько, то их нужно разделить амперсандом (&). Пример: calendarin.net/calendar.php?year=2016&display=work-days-and-days-off
Основной файл всё также называется, за ним следует вопросительный знак (?), затем - параметр «year» со значением «2016», затем - амперсанд (&), затем - параметр «display» со значением «work-days-and-days-off».
GET-параметры могут изменяться прямо в адресной строке браузера. Например, изменив значение «2016» на «2017» и нажав клавишу, вы перейдёте к календарю на 2017 год.
Это передача данных скрытым способом (адрес страницы не изменяется); то есть увидеть, что было передано, можно только с помощью программы (скрипта). Например, в следующем инструменте для подсчёта символов в тексте исходные данные передаются методом POST: http://usefulonlinetools.com/free/character-counter.php
Если остались вопросы, комментарии и мой E-mail к вашим услугам.
Кроме метода GET, который мы рассмотрели в предыдущей заметке, существует еще один метод отправки запроса по протоколу HTTP – метод POST. Метод POST тоже очень часто используется на практике.
Если, для того, чтобы обратиться к серверу методом GET, нам достаточно было набрать запрос в URL-адрес, то в методе POST все работает по другому принципу.
Для того, чтобы выполнить этот вид запроса, нам необходимо нажать на кнопку с атрибутом type=»submit», которая расположена на веб-странице. Обратите внимание, что эта кнопка расположена в элементе
Если пользователь введет в текстовое поле какой-либо текст и нажмет на кнопку «Отправить», то на сервер будет отправлена переменная text со значением того содержимого, которое ввел пользователь.