Form post запросы php. Типы HTTP-запросов и философия REST
Этот пост предназначен для объяснения принципов передачи данных в интернете с помощью двух основных методов: 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 со значением того содержимого, которое ввел пользователь.
POST и GET запросы простыми словами
Эта переменная будет отправлена методом POST.
Если в форме написать так:
Здесь обратим внимание на тег form
. Он имеет два параметра action
и method
. Первый отвечает за адрес страницы, на которую мы будем передавать наши данные, второй — за метод, которым эти данные будут передаваться. Внутри данного тега описываются набор наших данных, которые мы хотим передавать. Обязательно данным присваиваются имена (параметр name
). Так же обязателен input типа submit
, который является кнопкой, по нажатию на которую происходит отправка данных.
Давайте сохраним наш файл и откроем его в браузере.
Путь нашей страницы в браузере «…/index.php». На самой странице мы видим два поля для ввода и кнопку. Давайте вобъем в наши поля что-нибудь и нажмем на кнопку «Заказать». Наша страница обновилась. Давайте посмотрим на ее адрес: «…/index.php?orderName=Test&count=12». (я вбил в первое поле слово ‘Test’ во второе ’12’). Как мы видим адрес страницы немного поменялся. Дело в том что передача параметров GET запросом осуществляется путем их приписывания в строку адреса страницы. Параметры отделяются от основного адреса символом ‘?’, а разные параметры символом ‘&’. Структура параметров следующая: название_параметра=значение
. Название параметра будет совпадать со значением атрибута name в поле input.
Давайте немного подредактируем код страницы:
Теперь нажмем на кнопку «Заказать» еще раз. Как мы видим страница обновилась, однако наши поля остались заполнены. Это произошло благодаря тому, что мы указали значение по умолчанию для наших полей. Причем эти значения — полученный параметр GET. Как мы видим в PHP коде GET параметры являются массивом со строковым индексом равным имени параметра. Если сейчас поиграться с адресом сайта и в нем поменять значения параметров и нажать кнопку «Enter», то мы опять заметим картину с обновлением страницы и заполнением нашей формы.
Очевидно что пересылать секретные или служебные данные в GET запросе неправильно (и не безопасно). Его лучше использовать для передачи, например, id новости, которую стоит взять из базы или имени страницы, которую стоит отобразить.
Другое дело POST запрос. Работает он аналогично, однако не сохраняет параметры в строке адреса. Изменим нашу форму:
Как видно изменилось не многое, Однако! Откроем нашу страницу, вобъем что-нибудь в поля и нажмем кнопку «Заказать». Все сработало аналогично, однако (однако), как мы видим в строке запросов красуется адрес «…/index.php» без всякого рода параметров. Таким образом мы как бы «скрыли» наши данные от посторонних глаз. Конечно понятие скрыли, достаточно условное, так как эти данные все равно можно перехватить, но это уже другая история. Давайте допишем в наш адрес параметры «…/index.php?orderName=Trololo&count=100» и нажмем «Enter». Как мы видим страница загрузилась, однако даже не смотря на передачу параметров, поля оказались пустые. Это говорит о том что несмотря на большую схожесть, данные виды запросов никак не пересекаются между собой и если есть необходимость стоит писать обработчик для каждого типа запроса отдельно.
Думаю на этом хватит. Азы вопроса, я думаю, описаны с головой.
И еще немного… Не стоит забывать о проверке передаваемых параметров. Если Вы точно знаете, что параметр должен являться числом, то присекайте все попытки передачи не числового значения и т.п…
Сейчас наиболее часто используются всего два HTTP метода: GET и POST. Но оказалось, что даже среди этих двух «сосен» веб разработчики умудряются теряться. Этому есть объяснение: оба метода можно использовать для получения одинакового результата. Но нужно помнить, что необдуманное применение какого-либо из методов может привести к плачевным последствиям, среди которых большие нагрузки на канал и дыры в безопасности.
Чтобы этого избежать достаточно просто детальней разобраться в назначениях и различиях этих методов.
Если вникнуть в значение названий методов, уже многое прояснится. GET (с англ. получать), т.е. следует применять для запроса данных. POST (c англ. отправлять по почте) — применяем для отправки данных на сервер. Вроде все предельно просто и понятно. Но кто желает разрабатывать сайты чуть сложнее сайта визитки с одной формой обратной связи, лучше с вопросом познакомиться поближе.
Безопасные и небезопасные HTTP запросы
Спецификация HTTP 1.1 вводит два понятия: безопасный и небезопасный запрос, или если быть более точным, метод.
Безопасные — это методы, которые могут лишь запросить информацию. Они не могут изменить запрашиваемый ресурс, не могут привести к нежелательным результатам для пользователя, других лиц или сервера. Примерами безопасных есть запрос HTML кода веб страницы или изображения. К безопасным относятся методы HEAD и GET.
Заметка
В реальности умельцы конечно могут нанести вред и GET запросами. Например, зацикливаниями запросов.
Небезопасные запросы, как уже все догадались, могут потенциально привести к нехорошим последствиям, если ими воспользоваться повторно. Такие запросы могут менять содержимое ресурса, к которому обращаются. Примеры таких запросов: отправка сообщений, регистрация, онлайн платежи. К небезопасным относятся методы POST, PUT, DELETE.
Идемпотентнные (idempotent) методы
Идемпотентность — свойство методов, которые при многочисленном повторном обращении вернут один и тот же результат, кроме случаев когда информация устарела. Это значит, что при обращении к одному и тому же URL все пользователи будут видеть одну и туже веб страницу, изображение, видео и т.п. Таким свойством обладают GET, PUT, DELETE методы.
А теперь подробней о самих методах GET и POST: составим каждому короткое «резюме».
GET
предназначен для получения данных с сервера;
тело запроса пустое;
обрабатываются на стороне сервера быстрее и с меньшим потреблением ресурсов сервера за счет пустого тела запроса;
передача переменных происходит в адресной строке (так видит пользователь, технически данные предаются в строке запроса) и поэтому видна информация о переменных и их значениях (данные не защищены);
способен передать небольшое количество данных на сервер: есть ограничения на длину URL, которое зависит от браузера, например, IE6 = 2Kb. На это число и рекомендуют ориентироваться разработчики Yahoo!;
может передать только ASCII символы;
такой запрос можно скопировать, сохранить (например, в закладках);
запрос может кэшироваться (этим можно управлять);
для дополнительного снижения нагрузки на канал и сервер доступны условные и частичные запросы;
не разрывает HTTP соединение (при включенном на сервере режиме keepAlive).
POST
предназначен для отправления данных на сервер;
передача данных происходит в теле запроса;
обработка на стороне сервера медленнее и «тяжелее», чем GET, потому что помимо заголовков нужно анализировать тело запроса;
способен передать большие объемы данных;
способен передать файлы;
страницу, сгенерированную методом POST нельзя сохранить в закладки;
разрывает HTTP соединение;
для передачи даже очень малого объема информации большинством браузеров отправляет минимум два TCP пакета: заголовок, а потом тело запроса.
Оказывается не такие уж и похожие эти два метода. Применение того или иного должно быть обусловлено поставленной задачей, а никак не тем, что GET используется по умолчанию или с ним легче работать. GET, конечно, в большинстве случаев более выигрышный вариант, особенно при построении быстрых AJAX, но не стоит забывать о его недостатках. Для себя же сделал простую алгоритм-заметку по выбору метода.
Создание стандарта сети Интернет Web 2.0 позволило
пользователю не только принимать информацию, но и активно взаимодействовать с
другими пользователями и интернет-сервисами. Для организации такой обратной
связи в язык HTML были введены
дополнительные теги, позволяющие отправлять на сервер запрашиваемую информацию.
Например, это может быть форма регистрации, или форма добавления комментария,
или настройка личного аккаунта (страницы социальной сети) и т.п. В данной главе
рассмотрим набор тегов, позволяющих организовывать взаимодействие пользователя
с сайтом.
6.1. GET и POST-запросы
Для организации взаимодействия
пользователя с сетью Интернет, разработчик сайта должен предусмотреть передачу
запросов от пользователя сайта на сервер, где расположен данный сайт. Запросы
бывают двух видов: GET- и POST-запросы.
GET
-запросы
На раннем этапе развития сети Интернет
существовали только GET-запросы. Они представляют собой передачу данных
непосредственно в адресной строке браузера, имеющих следующий синтаксис:
Здесь
набор передаваемых данных на сервер начинаются с символа ‘?’ и разделяются
символом ‘&’. Сами данные представляют собой пары
параметр=значение
Например,
если требуется передать имя и фамилию пользователя на странице регистрации
(например, register.php) сайта mysite.com, то это будет
выглядеть так:
Следует обратить внимание, что браузеры
устаревших версий могут некорректно воспринимать кириллицу и передача русских
букв будет осуществляться неверно. Лучше в GET-запросах
передавать исключительно служебную информацию в виде чисел и слов на латинском
языке.
Недостатком GET-запросов
является ограниченность передаваемых данных. На стороне сервера строка запроса
ограничивается некоторым максимальным значением. Например, если максимальный
размер запроса может составлять 1024 символа, то все что превышает это значение
будет удалено и тогда часть передаваемой информации не будет обработана
указанной страницей сайта. Вторым существенным ограничением является
возможность передачи строго определенных наборов символов. Например, символы?
и & уже зарезервированы и их передавать как значения параметров нельзя.
Однако это правило можно обойти, если в строке запроса передавать не сам
символ, а его кодовое значение. Для этого используется символ ‘%’, за которым
следует код символа, например, так:
Здесь
кодовые значения указаны в шестнадцатиричном виде с целью экономии длины
запроса.
Несмотря на указанные недостатки,
создание сайтов без GET-запросов было бы крайне затруднительно. Например,
они незаменимы в случаях начальной инициализации страницы сайта для конкретного
пользователя, когда в запросе указывается не только сайт и текущая страница, но
и его id, как это
сделано в социальной сети Вконтакте:
http://vk.com/profile.php?id=12345678
Также
GET-запросы часто
применяются для проверки корректности email-адреса при
регистрации пользователя. В этом случае пользователю на указанный email приходит письмо
со ссылкой активации и эта ссылка представляет собой GET-запрос.
POST
-запросы
Для решения указанных недостатков GET-запросов были
добавлены POST-запросы,
позволяющие передавать большие объемы данных в бинарном виде, т.е. без
искажений и изменений передаваемых данных. Такие запросы хорошо подходят для
загрузки файлов и изображений на сервер. Например, когда пользователь загружает
изображение в свой профиль социальной сети, то для этого используются POST-запросы. Более
подробно об организации POST-запросов будет сказано ниже.