Тарифы Услуги Сим-карты

Отличие get от post. Использование методов GET и POST

Сегодня мне немного захотелось ударится в примитивные вещи и описать то, что можно найти во всемирной сети в большом количестве и без особых трудов. Речь пойдет практически о святая святых протокола HTTP: POST и GET запросах.

Многие спросят зачем? Отвечу коротко и ясно: что это и зачем это нужно — знают далеко не все, а те кто хочет узнать об этом (при этом мало что понимая в it сфере) часто не могут понять то что пишут во многих и многих статьях посвященных данной теме. Я же постараюсь на пальцах объяснить что такое POST и GET запросы и с чем их едят.
Итак, начнем наше путешествие в сказку…
Если вы читаете данное сообщение, то Вы как минимум знаете как выглядит Интернет и что такое Интернет сайт. Опустив все тонкости работы всемирной паутины, будем оперироваться такими понятиями как пользователь и сайт. Как ни крути но эти два субъекта должны как-то взаимодействовать друг с другом. Вот люди, например, общаются между собой благодаря жестам, эмоциям и речи, животные издают какие-то звуки, а что же происходит при «общении» человека и Интернет ресурса? Здесь мы имеем случай обмена информацией, который можно перенести и на человеческий разговор плана «Вопрос-Ответ». Причем и вопросы и ответы могут задавать как и пользователь, так и сайт. Когда мы говорим о сайте, то его вопросы и ответы, как правило, всегда выражаются в виде Интернет страницы с тем или иным текстом. Когда же речь идет о пользователе, то тут все происходит благодаря GET и POST запросам (конечно не только, но мы говорим о них).

Таким образом мы выяснили, что объекты нашей темы необходимы для «общения» с сайтами. Причем как и GET, так и POST запросы могут использоваться и для «задания вопросов» сайту и для «ответов». Чем же они отличаются? Все достаточно просто. Однако для объяснения различий, придется рассмотреть пример, в качестве которого возьмем сайт плана Интернет магазин.
Наверное Вы часто обращали внимание, когда искали что-нибудь в онлайн магазинах, что прибегая к поиску по фильтрам, адрес сайта превращался из красивого «http://magaazin.ru» в страшный «http://magaazin.ru/?category=shoes&size=38». Так вот, все что идет после символа ‘?’ и есть Ваш GET запрос сайту, а если быть совсем точным, то в данном случае Вы как бы спрашиваете сайт, о том что у него есть в категории «Обувь» с размеров «38» (данный пример взят из головы, на деле все может выглядеть не так очевидно). В итоге мы имеем что вопросы мы можем задавать сами, путем указания их в строке адреса сайта. Очевидно, что данный метод имеет несколько недостатков. Во-первых, любой кто находится рядом с пользователем за компьютером, может спокойно подсмотреть все данные, поэтому использовать данный вид запросов для передачи паролей крайне не желательно. Во-вторых, есть ограничение на длину строки, которая может быть передана из поля адреса сайта, а значит особо много данных передать не получится. Однако несомненным плюсом использования GET запросов является его простота использования и возможность быстро спрашивать сайт, что особенно бывает полезно при разработке, но это уже другая история…
Теперь поговорим о POST запросах. Догадливые читатели, возможно, смекнули, что главным отличаем данного запроса от его собрата — скрытность передаваемых данных. Если рассматривать Интернет магазин, то ярким примером где используется запрос POST — регистрация на сайте. Сайт спрашивает Ваши данные, Вы эти данные заполняете и при нажатии на кнопку «Регистрация» посылаете свой ответ. Причем никак внешне эти данные не отобразятся. Так же стоит отметить, что запрашивать могут достаточно большое количество информации — а значим ограничений POST запрос не имеет. Ну и если затронуть минус, то такой запрос быстро не сгенерируешь. Без специальных навыков, тут уже не обойтись. Хотя на самом деле все не так уж и сложно, но это опять же — другая история.
Подведем небольшой итог. POST и GET запросы нужны для «общения» пользователя и сайта. Они по сути практически являются противоположностью друг друга. Использование тех или иных видов запросов зависит от конкретной ситуации и пользоваться только одним видом запроса крайне неудобно.

Создание стандарта сети Интернет Web 2.0 позволило пользователю не только принимать информацию, но и активно взаимодействовать с другими пользователями и интернет-сервисами. Для организации такой обратной связи в язык HTML были введены дополнительные теги, позволяющие отправлять на сервер запрашиваемую информацию. Например, это может быть форма регистрации, или форма добавления комментария, или настройка личного аккаунта (страницы социальной сети) и т.п. В данной главе рассмотрим набор тегов, позволяющих организовывать взаимодействие пользователя с сайтом.

6.1. GET и POST-запросы

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

GET -запросы

На раннем этапе развития сети Интернет существовали только GET-запросы. Они представляют собой передачу данных непосредственно в адресной строке браузера, имеющих следующий синтаксис:

http://домен/страница?[параметр1=значение1][&параметр2=значение2]...

Здесь набор передаваемых данных на сервер начинаются с символа ‘?’ и разделяются символом ‘&’. Сами данные представляют собой пары

параметр=значение

Например, если требуется передать имя и фамилию пользователя на странице регистрации (например, register.php) сайта mysite.com, то это будет выглядеть так:

http://mysite.com/register.php?fname=Иван&lname=Иванов

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

Недостатком GET-запросов является ограниченность передаваемых данных. На стороне сервера строка запроса ограничивается некоторым максимальным значением. Например, если максимальный размер запроса может составлять 1024 символа, то все что превышает это значение будет удалено и тогда часть передаваемой информации не будет обработана указанной страницей сайта. Вторым существенным ограничением является возможность передачи строго определенных наборов символов. Например, символы? и & уже зарезервированы и их передавать как значения параметров нельзя. Однако это правило можно обойти, если в строке запроса передавать не сам символ, а его кодовое значение. Для этого используется символ ‘%’, за которым следует код символа, например, так:

http://mysite.com/register.php?fname=%CC%DF%AD%1F%DS&lname=%DD

Здесь кодовые значения указаны в шестнадцатиричном виде с целью экономии длины запроса.

Несмотря на указанные недостатки, создание сайтов без GET-запросов было бы крайне затруднительно. Например, они незаменимы в случаях начальной инициализации страницы сайта для конкретного пользователя, когда в запросе указывается не только сайт и текущая страница, но и его id, как это сделано в социальной сети Вконтакте:

http://vk.com/profile.php?id=12345678

Также GET-запросы часто применяются для проверки корректности email-адреса при регистрации пользователя. В этом случае пользователю на указанный email приходит письмо со ссылкой активации и эта ссылка представляет собой GET-запрос.

POST -запросы

Для решения указанных недостатков GET-запросов были добавлены POST-запросы, позволяющие передавать большие объемы данных в бинарном виде, т.е. без искажений и изменений передаваемых данных. Такие запросы хорошо подходят для загрузки файлов и изображений на сервер. Например, когда пользователь загружает изображение в свой профиль социальной сети, то для этого используются POST-запросы. Более подробно об организации 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 ;) Если будет время,то разберу эту тему более подробно

Современные веб-ресурсы не просто предоставляют информацию посетителю, но и взаимодействуют с ним. Для взаимодействия с пользователем нужно получать некоторую информацию от него. Для получения данных есть несколько методов, очень распространенные методы GET и POST . И соответственно в PHP есть поддержка этих методов передачи данных GET и POST . Посмотрим, как работают эти методы.
Метод GET Данные методом GET передаются путем их добавления к URL-адресу вызываемого сценария, предназначенного для обработки полученной информации. Для пояснения данного метода наберите в адресной строке браузера URL-адрес ресурса и добавьте сначала знак вопроса (? ), а затем строчку num=10 . Например

http://домен.ru/script.php?num=10


Если у вас локальный сервер, то обычно домен будет localhost , и тогда предыдущая запись будет выглядеть

http://localhost/script.php?num=10


В этом случае мы передаем параметр num равный 10. Для добавления следующих параметров сценарию нужно использовать разделитель - амперсант (& ), например

http://домен.ru/script.php?num=10&type=new&v=text


В данном случае мы передали скрипту три параметра: num со значением 10, type со значением "new " и v со значением "text ".
Для получения этих параметров в скрипте нужно использовать встроенный массив $_GET $_GET["num"], $_GET["type"],$_GET["v"] . Эти элементы массива и будут содержать значения переданных параметров. Для демонстрации этого примера создайте файл script.php следующего содержания



Проверка метода GET в PHP


echo ($_GET["num"]."
");
echo ($_GET["type"]."
");
echo ($_GET["v"]);
?>


И теперь вызовите этот файл в браузере

http://путь/script.php?num=10&type=new&v=text


и вы увидите переданные параметры в окне браузера. Но если вы вызовите этот файл без дополнительных параметров http://путь/script.php , то увидите ошибки, которые выдаст интерпретатор PHP , о том, что таких элементов массива $_GET нет. Проверке данных получаемых от пользователя можно посветить не одну статью, поэтому в этой статье я не буду затрагивать этот момент.
Как вы, наверное, понимаете заставлять пользователя набирать данные в адресной строке браузера не очень хорошо и совсем неудобно. Поэтому для приема данных от пользователя нужно использовать html -формы. Напишем простенькую html -форму.


Введите число

У Вас есть компьютер?

Ваш комментарий:





Немного прокомментирую созданную форму. Формы создаются тегом 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 :



Проверка метода POST в PHP


echo ($_POST["num"]."
");
echo ($_POST["type"]."
");
echo ($_POST["v"]);
?>


Теперь откройте файл forma_post.php в браузере. Введите какие-нибудь данные в поля формы и нажмите кнопочку "Отправить". Сейчас, наверное, вы заметили отличие метода POST от GET - в адресной строке браузера не появились данные формы. Данные методом POST нельзя передать через адресную строку браузера. Это существенное отличие нужно запомнить.
В PHP в независимости, каким способом были отправлены данные - методом POST или методом GET - получить данные можно используя массив $_REQUEST .Сравнение методов GET и POST При использовании метода GET данные передаются путем добавления к URL-адресу. Таким образом, они будут видны пользователю, что с точки зрения безопасности не всегда хорошо. Также максимальный объем передаваемых данных будет зависеть от браузера - от максимально-допустимого количества символов адресной строке браузера.
При использовании метода POST данные не будут видны пользователю (не отображаются в адресной строке браузера). И поэтому они более защищены, а, следовательно, и программа обрабатывающая эти данные более защищена в плане безопасности. Также объем передаваемых данных практически ни чем не ограничен.
Выбирая способ передачи данных нужно учитывать приведенные особенности и останавливаться на наиболее приемлемом методе.

Сейчас наиболее часто используются всего два 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, но не стоит забывать о его недостатках. Для себя же сделал простую алгоритм-заметку по выбору метода.