Сайт о телевидении » Интернет » Отличие post запросов от get. Как отправить post запрос из браузера: метод пост
Отличие post запросов от get. Как отправить post запрос из браузера: метод пост
Вы могли заметить, что на большинство сайтов можно лицезреть вот такие адреса:
Http://сайт/index.php?blog=2
Тут, даже не зная php, можно догадаться, что мы обращаемся к файлу index.php
Но то, что идет после знака вопроса, мало кто знает. Все довольно просто: ?blog=2
это объявление глобальной переменной «$_GET["blog"]» с значением «2». Таким образом я в скрипт передаю переменную которая отвечает за вывод информации из базы данных. Давайте напишем небольшой скрипт в котором Вы все наглядно увидите:
Мы используем оператор условий if() в качестве условия стоит вот такая строчка:
Isset($_GET["blog"])
isset() позволяет узнать существует ли переменная которая указана в скобках, то есть условие которое я описал в коде звучит так: Если существует переменная $_GET["blog"] то вывести содержимое этой переменной на экран. Вот что получилось:
Думаю понятно Создается глобальная переменная $_GET
с идентификатором который мы объявили в адресной строке (в данном случае с идентификатором «blog»
)
Теперь хочу пояснить один момент. Предположим нам необходимо объявить две переменные, как это сделать? Первая переменная объявляется после знака вопроса «?» Вторая же переменная объявляется после такого знака «&» (Если честно не знаю что это за знак
), вот пример объявление трех переменных:
Http://сайт/index.php?a=1&b=2&c=3
Вот код вывода:
if(isset($_GET["a"]) AND isset($_GET["b"]) AND isset($_GET["c"])) { echo $_GET["a"]." "; echo $_GET["b"]." "; echo $_GET["c"]." "; } ?>
Условие звучит так:
Если существует глобальная переменная $_GET["a"] и
глобальная переменная $_GET["b"] и
глобальная переменная $_GET["с"] то вывести их на экран
, вот результат:
Формы
Прежде чем мы перейдем к post
запросам, необходимо разобрать, что такое формы? Почему нужно? Потому что глобальная переменная $_POST[""] создается именно через формы. Что такое форма? Это поля для ввода какой-нить информации пользователем. Поля бывают в одну строчку, большие поля, так же бывают радио кнопочки, чек боксы. Разберем все по порядку...
Форма это тег:
У формы есть атрибуты, перечислю самые распространенные:
Давайте создадим форму:
В качестве файла обработчика я поставил файл test.php
так как именно в нем пишу для Вас примеры. Метод отправки я поставил post так как именно этим методам пользуются в 99.9% случаях. Так же я присвоил нашей форме имя — form
Теперь окунемся в мир элементов формы. Первым делом Вы должны понять, что почти все элементы являются тегом отличие лишь в атрибуте type
у этих тегов. Давайте я перечислю используемые элементы форм:
Я уверен, что вы не раз встречали такие поля, так что тут как говорится: «no comments»
Теперь давайте составим небольшую тренировочную анкету, с которой будем работать далее. Наша задача составить небольшую анкетку которая поведает нам имя заполнявшего, пол, из какой он страны, любимый цвет и поле текста где пользователь может добавить что-нить о себе. Вот что у меня получилось:
Если пользователь введет в текстовое поле какой-либо текст и нажмет на кнопку «Отправить», то на сервер будет отправлена переменная text со значением того содержимого, которое ввел пользователь.
POST и GET запросы простыми словами
Эта переменная будет отправлена методом POST.
Если в форме написать так:
Немного прокомментирую созданную форму. Формы создаются тегом form
. Поля формы создаются тегами input
, select
, textarea
(подробнее можно почитать ). В теге form
в атрибуте action
указывается URL-адрес скрипта, который получит данные формы. В нашем случае мы указали уже существующий у нас файл script.php
. Атрибут method
задает метод отправки данных. Мы указали метод GET
. Теперь мы знаем, какому файлу будут переданы данные формы, и каким способом, осталось разобраться, где их там искать?! Данные этой формы будут переданы веб-ресурсу браузером путем добавления их к URL-адресу: сначала будет знак вопроса (?
), затем будут представлены параметры разделенные амперсантом (&
). Название параметра будет браться из атрибута name
, которое должно быть прописано у любого поля формы. Значение параметра будет зависеть от типа поля. Если поле является текстовым, то значением будет введенный пользователем текст. Если же поле будет представлять собой список, группу переключателей или флажков, то значением параметра будет значение атрибута value
выбранного элемента. Поясню на примере нашей формы. Если пользователь введет в поле input
число 10, то названием параметра будет num
(значение атрибута name
тега input
), а значением будет 10 (введенное пользователем число). Соответственно браузер сформирует пару "num=10
". Если пользователь из списка выберет вариант "Да", то названием параметра будет type
(значение атрибута name
тега select
), а значением будет yes
(значение атрибута value
тега option
). Соответственно браузер сформирует пару "type=yes
". Теперь эту форму разместим на странице forma.php
.
Форма для передачи данных методом GET и PHP
Введите в поля формы какие-либо значения и нажмите кнопку "Отправить". После нажатия кнопки браузер откроет другую страницу (script.php
), и в окне браузера будут отображены данные, которые вы ввели. Я думаю понятно почему: браузер передаст данные сценарию script.php
, и в скрипте эти данные будут обработаны и выведены на экран. Метод POST
Теперь давайте рассмотрим, как работает метод POST
. Для отправки данных методом POST
нужно использовать HTML
-формы. Как мы помним, что за способ отправки данных формы отвечает атрибут method
тега form
. Поэтому нужно в атрибуте method
тега form
указать значение POST
. В остальном форма может быть та же, как и для метода GET
. Изменим нашу форму, которую мы уже использовали для передачи данных способом GET
, для передачи методом POST
.
Как видите, форма осталась та же за исключением атрибутов method
и action
. Теперь данные будут передаваться сценарию script_post.php
. Поместим нашу форму на странице forma_post.php
.
Форма для передачи данных методом POST и PHP
Теперь надо написать сценарий, который будет обрабатывать данные нашей формы. Для получения в скрипте данных переданным методом POST
нужно использовать встроенный массив $_POST
. Ключами этого массива будут названия параметров. В нашем случае нужно использовать $_POST["num"], $_POST["type"],$_POST["v"]
. Эти элементы массива и будут содержать значения переданных данных. Как видите отличие от использования способа GET
, выражается лишь в использовании массива $_POST
. Поэтому нам не составит труда написать файл script_post.php
:
Теперь откройте файл forma_post.php
в браузере. Введите какие-нибудь данные в поля формы и нажмите кнопочку "Отправить". Сейчас, наверное, вы заметили отличие метода POST
от GET
- в адресной строке браузера не появились данные формы. Данные методом POST
нельзя передать через адресную строку браузера. Это существенное отличие нужно запомнить. В PHP
в независимости, каким способом были отправлены данные - методом POST
или методом GET
- получить данные можно используя массив $_REQUEST
.Сравнение методов GET и POST
При использовании метода GET
данные передаются путем добавления к URL-адресу. Таким образом, они будут видны пользователю, что с точки зрения безопасности не всегда хорошо. Также максимальный объем передаваемых данных будет зависеть от браузера - от максимально-допустимого количества символов адресной строке браузера. При использовании метода POST
данные не будут видны пользователю (не отображаются в адресной строке браузера). И поэтому они более защищены, а, следовательно, и программа обрабатывающая эти данные более защищена в плане безопасности. Также объем передаваемых данных практически ни чем не ограничен. Выбирая способ передачи данных нужно учитывать приведенные особенности и останавливаться на наиболее приемлемом методе.
Очень давно хотел написать статью, в которой рассказать о разнице между методом POST и методом GET
, но всё как-то появлялись другие темы, и переключался на них. И вот, наконец-то, пришло время осветить эту тему, так как зачастую люди просто не знают, какая разница между POST и GET
.
Чтобы более наглядно отобразить разницу между POST и GET
, привожу таблицу, в которой видно, по каким характеристикам они различаются.
На основании этой характеристики можно делать вывод, когда нужно использовать POST
, а когда GET
. Например, если пользователь хочет сохранить сгенерированную страницу в закладки. То генерация должна происходить путём GET-запроса
, иначе добавить страницу в закладки не получится. Другой пример: при передаче логина и пароля нельзя ставить метод GET
, так как он основан на передаче данных через адресную строку. Иначе после нажатия кнопки "Submit
", в адресной строке появится что-то наподобии этого: "http://mysite.ru/login.php?log=User&pass=123456
", - и пароль может увидеть, кто угодно, чего, разумеется, допускать нельзя. Поэтому здесь надо использовать метод POST
.
Также не забывайте, что размер данных, которые можно передать методом POST
, на порядок больше, чем при передаче методом GET
. В общем, анализируйте эту таблицу и делайте вывод: каким методом передачи данных нужно пользоваться в конкретном случае. От себя добавлю, что в 80%
случаев надо использовать POST
, но и не забывайте, что это далеко не 100%
.
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Комментарии (15
):
dsmts
12.05.2013 14:00:18
Добрый день!
Мне нужно что бы при редиректе например:
header("Location: test.php"); передавался на эту страницу $_POST значение. Страница, с которой должно передаваться это значение не имеет ни каких форм. Т.е. она просто обрабатывает данные и формирует определенный запрос. На данный момент у меня сделана передача с помощью cookie. Но я не уверен, что это безопасно. Или я ошибаюсь? Данные, которые передаются, не должны быть видимы пользователям.
Ответить
Alex_
23.11.2013 23:56:10
Доброго времени суток:), Михаил! Пробую писать плагин на php и естественно обнаружил у себя нехватку знаний. Отсюда вопрос: если некий сайт (платежная система) после моих действий на моей стороне присылает мне на сайт на конкретную страницу данные методом POST должен ли я увидеть их если напишу в скрипте print_r($_POST); ? Просто в моем случае например print_r($_SERVER); видно какие данные в массиве $_SERVER, а $_POST пустой, то есть либо данные не приходят либо у меня профанский взгляд на то как на самом деле обстоят дела.
Ответить
23.11.2013 23:59:31
Здравствуйте,Александр
Обычно платёжные системы передают данные в обратном порядке в зашифрованном виде и по защищённым протоколам. Так что всё зависит от платёжной системы.
Вы пишете модуль оплаты для какой-либо конкретной системы?
Уточните запросы иначе я не смогу Вам помочь
Ответить
Alex_
24.11.2013 02:00:41
Здравствуйте Александр, спасибо за отклик. Пишу плагин для cms Wordpress, работаю с платежной системой interkassa.com . При удачной покупке перебрасывает на страницу успешной оплаты http://мой_сайт/success . на эту страницу согласно документации приходят данные, которые мне видны. То есть я в настройках выбирал передачу GET методом и приходит длинный url эта ссылка и в ней параметры http://мой_сайт/success/?&ik_payment_id=1&ik_paysystem_alias=yandexdengir ,все как положено. Пробовал выбирать метод передачи POST тогда в скрипте прописывал например if (isset($_POST["ik_trans_id"])) echo $_POST["ik_trans_id"]. И это работало. Потом стал работать со STATUS url потомучто тогда приходит ik_sign_hash который формируется интеркассой с использованием секретного ключа (который известен мне и интеркассе) и в этот раз if (isset($_POST["ik_sign_hash"]) не срабатывает потомучто его нет. У меня на сайте стоит плагин (не все делает как хотелось бы) написанный на ООП (до уровня того кто это писал мне еще далеко, может поэтому мне не очевидно что там используется). Этот плагин все отрабатывает и рассчитывает хеш на своей стороне, потомучто я умышленно менял секретный ключ (в настройках плагина) и на почту приходило письмо с уведомлением о неверно переданных данных (хеши не совпали)и просьбой обратиться к администратору сайта. Вот как-то так.
Ответить
24.11.2013 02:09:28
Ну,я не видел Ваш плагин,поэтому конкретного ничего не скажу.
Что касается простой реализации...Я не изучал API интеркассы.
Простое решение можете посмотреть тут:
http://goo.gl/rFnpNc
По сути во всех системах одинаково.
Я обычно с робокассой работаю или онпей,так что извините.
А вообще структура примерно такая.Вам нужно в соответствии с документацией API написать реализацию
http://www.interkassa.com/faq.php
смотрите тут раздел Interkassa глазами программиста и администратора+
Там в последнем из вопросов есть тех.документация для скачки ну и мелочи по API вообще
Ответить
Alex_
24.11.2013 02:16:40
Спасибо Александр. Видел я все это читал, пробую уже не первый день и гуглю вот и думаю может я чего не понимаю:). http://goo.gl/rFnpNc - а это плагин Андрея Морковина, написанный не до конца (наверное чтобы не раскрывать всех секретов скрипт теперь платный). По нему создано несколько видео уроков о том как писать плагины на WP. Вот этот плагин http://www.icprojects.net/paid-downloads-plugin.html есть в платной и бесплатной версии. В бесплатной версии доступна только оплата PAYPAL. но он весь и если поменять пару значений становится доступен режим Интеркассы в бета версии.
Ответить
24.11.2013 02:23:00
Да,я в курсе этого.Просто валялся плагин.До конца или нет,но он работал.Может,где-то версия и за 40у.е. валяется.
В любом случае ничего конкретного не посоветую. Читайте документацию по API Интеркасса
А алгоритмы везде одинаковы.Пишете обработчик который посылает данные в шифрованном виде и который их в таком же виде принимает и расшифровывает.
Можете подсмотреть решение у Левчука в его wppage ;)
Если будет время,то разберу эту тему более подробно