Параметры get запроса. Как отправить post запрос из браузера: метод пост

Современные веб-ресурсы не просто предоставляют информацию посетителю, но и взаимодействуют с ним. Для взаимодействия с пользователем нужно получать некоторую информацию от него. Для получения данных есть несколько методов, очень распространенные методы 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 данные не будут видны пользователю (не отображаются в адресной строке браузера). И поэтому они более защищены, а, следовательно, и программа обрабатывающая эти данные более защищена в плане безопасности. Также объем передаваемых данных практически ни чем не ограничен.
Выбирая способ передачи данных нужно учитывать приведенные особенности и останавливаться на наиболее приемлемом методе.

Первый метод для выполнения PHP POST запроса заключается в использовании file_get_contents . Второй метод будет использовать fread в сочетании с парой других функций. Оба варианта применяют функцию stream_context_create , чтобы заполнить необходимые поля заголовка запроса.

Пояснение кода

Переменная $sPD содержит данные, которые нужно передать. Она должна иметь формат строки HTTP-запроса , поэтому некоторые специальные символы должны быть закодированы.

И в функции file_get_contents , и в функции fread у нас есть два новых параметра. Первый из них — use_include_path . Так как мы выполняем HTTP- запрос , в обоих примерах он будет иметь значение false . При использовании значения true для считывания локального ресурса функция будет искать файл по адресу include_path .

Второй параметр — context , он заполняется возвращаемым значением stream_context_create , который принимает значение массива $aHTTP .

Использование file_get_contents для выполнения POST-запросов

Чтобы в PHP отправить POST запрос с помощью file_get_contents , нужно применить stream_context_create , чтобы вручную заполнить поля заголовка и указать, какая «обертка » будет использоваться — в данном случае HTTP :

$sURL = "http://brugbart.com/Examples/http-post.php"; // URL-адрес POST $sPD = "name=Jacob&bench=150"; // Данные POST $aHTTP = array("http" => // Обертка, которая будет использоваться array("method" => "POST", // Метод запроса // Ниже задаются заголовки запроса "header" => "Content-type: application/x-www-form-urlencoded", "content" => $sPD)); $context = stream_context_create($aHTTP); $contents = file_get_contents($sURL, false, $context); echo $contents;

Использование fread для выполнения POST-запросов

Для выполнения POST-запросов можно использовать функцию fread . В следующем примере stream_context_create используется для составления необходимых заголовков HTTP-запроса :

$sURL = "http://brugbart.com/Examples/http-post.php"; // URL-адрес POST $sPD = "name=Jacob&bench=150"; // Данные POST $aHTTP = array("http" => // Обертка, которая будет использоваться array("method" => "POST", // Request Method // Ниже задаются заголовки запроса "header" => "Content-type: application/x-www-form-urlencoded", "content" => $sPD)); $context = stream_context_create($aHTTP); $handle = fopen($sURL, "r", false, $context); $contents = ""; while (!feof($handle)) { $contents .= fread($handle, 8192); } fclose($handle); echo $contents;

Выполнение GET-запросов с помощью PHP

Теперь мы уделим внимание использованию fread и file_get_contents для загрузки контента из интернета через HTTP и HTTPS . Чтобы использовать методы, описанные в этой статье, необходимо активировать опцию fopen wrappers . Для этого в файле php.ini нужно установить для параметра allow_url_fopen значение On .

Выполнение POST и GET запросов PHP применяется для входа в систему на сайтах, получения содержимого веб-страницы или проверки новых версий приложений. Мы расскажем, как выполнять простые HTTP-запросы .

Использование fread для загрузки или получения файлов через интернет

Помните, что считывание веб-страницы ограничивается доступной частью пакета. Так что нужно использовать функцию stream_get_contents (аналогичную file_get_contents ) или цикл while , чтобы считывать содержимое меньшими фрагментами до тех пор, пока не будет достигнут конец файла:

В данном случае обработки POST запроса PHP последний аргумент функции fread равен размеру фрагмента. Он, как правило, не должен быть больше, чем 8192 (8*1024 ).

Этот пост - ответ на вопрос, заданный в к одной из моих статей.

В статье я хочу рассказать, что же из себя представляют HTTP-методы GET/POST/PUT/DELETE и другие, для чего они были придуманы и как их использовать в соответствии с REST.

HTTP

Итак, что же представляет из себя один из основных протоколов интернета? Педантов отправлю к RFC2616 , а остальным расскажу по-человечески:)

Этот протокол описывает взаимодействие между двумя компьютерами (клиентом и сервером), построенное на базе сообщений, называемых запрос (Request) и ответ (Response). Каждое сообщение состоит из трех частей: стартовая строка, заголовки и тело. При этом обязательной является только стартовая строка.

Стартовые строки для запроса и ответа имеют различный формат - нам интересна только стартовая строка запроса, которая выглядит так:

METHOD URI HTTP/VERSION ,

Где METHOD - это как раз метод HTTP-запроса, URI - идентификатор ресурса, VERSION - версия протокола (на данный момент актуальна версия 1.1).

Заголовки - это набор пар имя-значение, разделенных двоеточием. В заголовках передается различная служебная информация: кодировка сообщения, название и версия браузера, адрес, с которого пришел клиент (Referrer) и так далее.

Тело сообщения - это, собственно, передаваемые данные. В ответе передаваемыми данными, как правило, является html-страница, которую запросил браузер, а в запросе, например, в теле сообщения передается содержимое файлов, загружаемых на сервер. Но как правило, тело сообщения в запросе вообще отсутствует.

Пример HTTP-взаимодействия

Рассмотрим пример.

Запрос:
GET /index.php HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 Accept: text/html Connection: close
Первая строка - это строка запроса, остальные - заголовки; тело сообщения отсутствует

Ответ:
HTTP/1.0 200 OK Server: nginx/0.6.31 Content-Language: ru Content-Type: text/html; charset=utf-8 Content-Length: 1234 Connection: close ... САМА HTML-СТРАНИЦА...

Ресурсы и методы

Вернемся к стартовой строке запроса и вспомним, что в ней присутствует такой параметр, как URI. Это расшифровывается, как Uniform Resource Identifier - единообразный идентификатор ресурса. Ресурс - это, как правило, файл на сервере (пример URI в данном случае "/styles.css"), но вообще ресурсом может являться и какой-либо абстрактный объект ("/blogs/webdev/" - указывает на блок «Веб-разработка», а не на конкретный файл).

Тип HTTP-запроса (также называемый HTTP-метод) указывает серверу на то, какое действие мы хотим произвести с ресурсом. Изначально (в начале 90-х) предполагалось, что клиент может хотеть от ресурса только одно - получить его, однако сейчас по протоколу HTTP можно создавать посты, редактировать профиль, удалять сообщения и многое другое. И эти действия сложно объединить термином «получение».

Для разграничения действий с ресурсами на уровне HTTP-методов и были придуманы следующие варианты:

  • GET - получение ресурса
  • POST - создание ресурса
  • PUT - обновление ресурса
  • DELETE - удаление ресурса
Обратите внимание на тот факт, что спецификация HTTP не обязывает сервер понимать все методы (которых на самом деле гораздо больше, чем 4) - обязателен только GET, а также не указывает серверу, что он должен делать при получении запроса с тем или иным методом. А это значит, что сервер в ответ на запрос DELETE /index.php HTTP/1.1 не обязан удалять страницу index.php на сервере, так же как на запрос GET /index.php HTTP/1.1 не обязан возвращать вам страницу index.php, он может ее удалять, например:)

В игру вступает REST

REST (REpresentational State Transfer) - это термин был введен в 2000-м году Роем Филдингом (Roy Fielding) - одним из разработчиков протокола HTTP - в качестве названия группы принципов построения веб-приложений. Вообще REST охватывает более широкую область, нежели HTTP - его можно применять и в других сетях с другими протоколами. REST описывает принципы взаимодействия клиента и сервера, основанные на понятиях «ресурса» и «глагола» (можно понимать их как подлежащее и сказуемое). В случае HTTP ресурс определяется своим URI, а глагол - это HTTP-метод.

REST предлагает отказаться от использования одинаковых URI для разных ресурсов (то есть адреса двух разных статей вроде /index.php?article_id=10 и /index.php?article_id=20 - это не REST-way) и использовать разные HTTP-методы для разных действий. То есть веб-приложение, написанное с использованием REST подхода будет удалять ресурс при обращении к нему с HTTP-методом DELETE (разумеется, это не значит, что надо давать возможность удалить всё и вся, но любой запрос на удаление в приложении должен использовать HTTP-метод DELETE).

REST дает программистам возможность писать стандартизованные и чуть более красивые веб-приложения, чем раньше. Используя REST, URI для добавления нового юзера будет не /user.php?action=create (метод GET/POST), а просто /user.php (метод строго POST).

В итоге, совместив имеющуюся спецификацию HTTP и REST-подход наконец-то обретают смысл различные HTTP-методы. GET - возвращает ресурс, POST - создает новый, PUT - обновляет существующий, DELETE - удаляет.

Проблемы?

Да, есть небольшая проблема с применением REST на практике. Проблема эта называется HTML.

PUT/DELETE запросы можно отправлять посредством XMLHttpRequest, посредством обращения к серверу «вручную» (скажем, через curl или даже через telnet), но нельзя сделать HTML-форму, отправляющую полноценный PUT/DELETE-запрос.

Дело в том, спецификация HTML не позволяет создавать формы, отправляющие данные иначе, чем через GET или POST. Поэтому для нормальной работы с другими методами приходится имитировать их искусственно. Например, в Rack (механизм, на базе которого Ruby взаимодействует с веб-сервером; с применением Rack сделаны Rails, Merb и другие Ruby-фреймворки) в форму можно добавить hidden-поле с именем "_method", а в качестве значения указать название метода (например, «PUT») - в этом случае будет отправлен POST-запрос, но Rack сможет сделать вид, что получил PUT, а не POST.

Да да, все когда-то учились чему либо. Единственное что в этом плане отличает людей — кому-то учения даются легко, а кто-то не может разобраться в сути вопроса долгие месяцы. Сегодня мы поговорим о POST и GET запросах в HTML\PHP.

Сами запросы POST и GET (далее просто запросы) давно проросли корнями во все Интернет ресурсы. Если вдруг когда нибудь и появится альтернатива данным технологиям, то наверное это будет не скоро, да и, наверное, не нужно. Потому что наши запросы вполне полно выполняют задачу обмена данными между Интернет страницами.

Давайте рассмотри сначала запрос типа GET. Создадим файл index.php со стандартным html кодом, а так же разместим на нем форму, пусть это будет форма заказа товара.

Здесь обратим внимание на тег 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 запрос. Работает он аналогично, однако не сохраняет параметры в строке адреса. Изменим нашу форму:

$_POST["orderName"] ?> > $_POST["count"] ?> >

Как видно изменилось не многое, Однако! Откроем нашу страницу, вобъем что-нибудь в поля и нажмем кнопку «Заказать». Все сработало аналогично, однако (однако), как мы видим в строке запросов красуется адрес «…/index.php» без всякого рода параметров. Таким образом мы как бы «скрыли» наши данные от посторонних глаз. Конечно понятие скрыли, достаточно условное, так как эти данные все равно можно перехватить, но это уже другая история. Давайте допишем в наш адрес параметры «…/index.php?orderName=Trololo&count=100» и нажмем «Enter». Как мы видим страница загрузилась, однако даже не смотря на передачу параметров, поля оказались пустые. Это говорит о том что несмотря на большую схожесть, данные виды запросов никак не пересекаются между собой и если есть необходимость стоит писать обработчик для каждого типа запроса отдельно.

Думаю на этом хватит. Азы вопроса, я думаю, описаны с головой.

И еще немного… Не стоит забывать о проверке передаваемых параметров. Если Вы точно знаете, что параметр должен являться числом, то присекайте все попытки передачи не числового значения и т.п…

Последнее обновление: 1.11.2015

Метод get осуществляет GET-запрос к серверу, то есть все данные запроса передаются в строке запроса. Он принимает следующие параметры:

    url: обязательный параметр, содержащий адрес ресурса, к которому будет обращаться запрос

    data: необязательный параметр, содержащий простой объект javascript или строку, которые будут отправлены на сервер вместе с запросом

    success(data, textStatus, jqXHR) : необязательный параметр - функция обратного вызова, которая будет выполняться при успешном выполнении запроса. Она может принимать три параметра: data - данные, полученные с сервера, textStatus - - статус запроса и jqXHR - специальный объект jQuery, который представляет расширенный вариант объекта XMLHttpRequest .

    dataType: необязательный параметр, содержащий тип данных в виде строки, например, "xml" или "json"

На выходе метод get возвращает объект jqXHR , который будет инкапсулировать данные запроса. Позднее мы подробнее разберем этот объект.

Итак, перепишем пример из предыдущего параграфа с использованием метода get:

$(function(){ $("button").click(function(){ $.get("ajax.php", function(data) { $("#news").html(data); alert("Данные заружены"); }); }); });

Здесь использованы два первых параметра: адрес ресурса и функция обратного вызова. В этой функции в качестве параметра data мы получаем принятые от сервера данные и загружаем их в качестве разметки в элемент выборки ($("#news").html(data);). По сути то же самой мы могли бы сделать с помощью метода load .

Отправка данных

Используя параметр data, мы можем отправить дополнительные данные. Например, можно отправить запрос на получение элемента из базы данных по id:

$.get("ajax.php", { id: "1"});

А поскольку в GET-запросе все данные передаются в строке запроса, то данный код будет аналогичен следующему:

$.get("ajax.php?id=1");

Соответственно на стороне сервера мы сможем получить этот параметр и произвести с ним какие-либо действия, например, получить элемент из бд по данному id:

Использование типа данных

Нередко возникает такая ситуация, когда сервер отправляет данные в определенном формате, например, json или xml. Так, php-файл на стороне сервера мог бы выглядеть следующим образом:

"Начало чемпионата России","date"=>"13.07.2013")); ?>

В данном случае он возвращает объект json. Тогда на клиентской стороне мы можем явно прописать тип данных, а в функции обработать принятые данные:

$.get("ajax.php", function(data) { $("#news").empty().append("

Поделиться