Вы могли заметить, что на большинство сайтов можно лицезреть вот такие адреса:
Http://сайт/index.php?blog=2
Тут, даже не зная php, можно догадаться, что мы обращаемся к файлу index.php
Но то, что идет после знака вопроса, мало кто знает. Все довольно просто: ?blog=2
это объявление глобальной переменной «$_GET["blog"]» с значением «2». Таким образом я в скрипт передаю переменную которая отвечает за вывод информации из базы данных. Давайте напишем небольшой скрипт в котором Вы все наглядно увидите:
if(isset($_GET["blog"])) { echo $_GET["blog"]; } ?>
Мы используем оператор условий 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»
Теперь давайте составим небольшую тренировочную анкету, с которой будем работать далее. Наша задача составить небольшую анкетку которая поведает нам имя заполнявшего, пол, из какой он страны, любимый цвет и поле текста где пользователь может добавить что-нить о себе. Вот что у меня получилось:
, у которого установлен атрибут method со значением post.
Рассмотрим этот HTML-код:
Введите текст:
Если пользователь введет в текстовое поле какой-либо текст и нажмет на кнопку «Отправить», то на сервер будет отправлена переменная text со значением того содержимого, которое ввел пользователь.
POST и GET запросы простыми словами
Эта переменная будет отправлена методом POST.
Если в форме написать так:
То данные будут отправляться методом GET.
Если, в случае с GET-запросом, объем данных, которые мы могли передать ограничивался длиной адресной строки браузера, то в случае с запросом POST, такого ограничения нет, и мы можем передавать значительные объемы информации.
Еще одно отличие метода POST от GET, метод POST скрывает все передаваемые им переменные и их значения, в своём теле (Entity-Body). В случае с методом GET они хранились в строке запроса (Request-URI).
Вот пример запроса, выполненного методом POST:
POST / HTTP/1.0\r\n Host: www.site.ru\r\n Referer: http://www.site.ru/index.html\r\n Cookie: income=1\r\n Content-Type: application/x-www-form-urlencoded\r\n Content-Length: 35\r\n \r\n login=Dima&password=12345
Таким образом, передавая данные методом POST, их будет намного труднее перехватить злоумышленнику, т.к. они скрыты от непосредственного просмотра, поэтому метод передачи данных методом POST считается более безопасным способом.
Кроме того, методом POST можно передавать не только текст, но и мультимедиа данные (картинки, аудио, видео). Существует специальный параметр Content-Type, который определяет тот вид информации, который необходимо передать.
Ну и, наконец, чтобы на сервере получить данные, которые были переданы этим методом, используется переменная POST.
Вот пример обработки на языке PHP:
echo $_POST[‘text’]; ?>
В прошлой заметке, мы определились с тем, что браузер (клиент) отправляет серверу HTTP запросы, а сервер отправляет клиенту HTTP ответы. Эти запросы и ответы оформляются по определенным правилам. Есть, что-то вроде синтаксиса, как и в какой последовательности, должно быть написано. Должна быть строго определенная структура.
Давайте более подробно рассмотрим эту структуру, по которой строятся запросы и ответы в протоколе HTTP.
HTTP запрос состоит из трех основных частей, которые идут в нем именно в том порядке, который указан ниже. Между заголовками и телом сообщения находится пустая строка (в качестве разделителя), она представляет собой символ перевода строки.
Пустая строка (разделитель)
Post и Get запросы, какая между ними разница и что лучше и для каких целей?
тело сообщения (Entity Body) – необязательный параметр
Строка запроса
– указывает метод передачи, URL-адрес, к которому нужно обратиться и версию протокола HTTP.
Заголовки
– описывают тело сообщений, передают различные параметры и др. сведения и информацию.
тело сообщения
— это сами данные, которые передаются в запросе. Тело сообщения – это необязательный параметр и может отсутствовать.
Когда мы получаем ответный запрос от сервера, тело сообщения, чаще всего представляет собой содержимое веб-страницы. Но, при запросах к серверу, оно тоже может иногда присутствовать, например, когда мы передаем данные, которые заполнили в форме обратной связи на сервер.
Более подробно, каждый элемент запроса, мы рассмотрим в следующих заметках.
Давайте, для примера, рассмотрим один реальный запрос к серверу. Я выделил каждую часть запроса своим цветом: строка запроса — зеленый, заголовки — оранжевый, тело сообщения- голубой.
Запрос от браузера:
Host: webgyry.info
Cookie: wp-settings
Connection: keep-alive
В следующем примере уже присутствует тело сообщения.
Ответ сервера:
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=5
X-Pingback: //webgyry.info/xmlrpc.php
Документ без названия
Вот такими сообщениями обмениваются клиент и сервер по протоколу HTTP.
Кстати, хотите узнать есть ли смысл в каком-то элементе на вашем сайте с помощью «целей» Яндекс Метрики и Google Analytics?
Уберите то, что НЕ работает, добавьте то, что работает и удвойте вашу выручку.
Курс по настройке целей Яндекс Метрики..
Курс по настройке целей Google Analytics..
HTTP клиент посылает запрос на сервер в форме cсообщения-запроса, которое имеет следующий формат:
Строка запроса (обязательный элемент)
Заголовок (опционалный элемент)
Пустая строка (обязательный элемент)
Тело сообщения (опциональный элемент)
Рассмотрим каждый из этих элементов по отдельности.
Строка запроса
Строка запроса начинается с токена метода, после которого следует URI запроса и версия протокола. Элементы отедляются друг от друга пробелами:
Расмотрим данный элемент более подробно
Метод запроса
Данный элемент указывает метод, который должен быть вызван на стороне сервера по указанному индентификатору URI.
В HTTP существует восемь методов:
HEAD
Используется для получения строки статуса и заголовка от сервера по URI. Не изменяет данные.
GET Используется для получения данных от сервера по указанному URI. Не изменяет данные.
POST Используется для отправки данных на сервер (например информации о разработчике и т.д.) с помощью форм HTML.
PUT Замещает все предыдущие данные на ресурсе новыми загруженными данными.
DELETE Удаляет все текущие данные на ресурсе, определённом URI.
CONNECT Устанавливает туннельное соединение с сервером по указанному URI.
OPTIONS Описывает свойства соединения для указанного ресурса.
TRACE Предоставляет сообщение, содержащее обратный трейс расположения указанного в URI ресурса.
URI запроса
URI (Uniform Resource Identifier) – это идентификатор ресурса на который отправляется запрос. Ниже приведён наиболее часто встречающийся формат URI:
‘*’
используется когда HTTP запрос не относится к конкретному ресурсу, но к серверу. Используется только в случае, когда метод не обязательно применять к ресурсу. Например,
абсолютныйURI
используется, когда HTTP запрос выполняется на прокси. Прокси запрашивается для передачи запроса из доступного кэша и возвращает ответ. Например:
асболютный_путь | источник
используется наиболее чатсо.
Учимся работать с GET и POST запросами
Запрашивается конкретный ресурс определённого сервера. Например, клиент хочет получить ресурс с сервера через 80-й порт. Адрес ресурса “www.proselyte.net” и отправляет следующий запрос:
Запрос полей заголовка
Поля заголовка позволяют клиенту передать дополнительную информацию о запросе и о себе самом серверу. Эти поля действуют как модификаторы запроса.
Ниже приведён списко наиболее важных полей заголовка, которые могут быть использованы:
Accept-Charset
Accept-Encoding
Accept-Language
Authorization
Expect
If-Match
If-Modified-Since
If-None-Match
If-Range
If-Unmodified-Since
Range
Referer
User-Agent
Если мы заотим реализовать своего собственного клиента и свой собственный веб-сервер, то мы можем создавать собственные поля заголовка.
Пример HTTP запроса
На этом мы заканчиваем изучение запросов HTTP. В следующей статье мы рассмотрим HTTP ответы.
Одним из способов, как можно отправить запрос по протоколу HTTP к серверу, является запрос методом GET. Этот метод является самым распространенным и запросы к серверу чаще всего происходят с его использованием.
Самый простой способ, как можно создать запрос методом GET- это набрать URL-адрес в адресную строку браузера.
Браузер передаст серверу примерно следующую информацию:
GET / HTTP/1.1 Host: webgyry.info User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Cookie: wp-settings Connection: keep-alive
Запрос состоит из двух частей:
1. строка запроса (Request Line)
2. заголовки (Message Headers)
Обратите внимание, что GET запрос не имеет тела сообщения. Но, это не означает, что с его помощью мы не можем передать серверу никакую информацию.
Различие между методами GET и POST
Это можно делать с помощью специальных GET параметров.
Чтобы добавить GET параметры к запросу, нужно в конце URL-адреса поставить знак «?» и после него начинать задавать их по следующему правилу:
имя_параметра1=значение_параметра1& имя_параметра2=значение_параметра2&…
Разделителем между параметрами служит знак «&».
К примеру, если мы хотим передать серверу два значения, имя пользователя и его возраст, то это можно сделать следующей строкой:
http://site.ru/page.php?name=dima&age=27
Когда выполнен данный запрос, данные попадают в так называемую переменную окружения QUERY_STRING, из которой их можно получить на сервере с помощью серверного языка веб-программирования.
Вот пример, как это можно сделать на PHP.
echo «Ваше имя: » . $_GET[«name»] . « »; echo «Ваш возраст: » . $_GET[«age»] . « »; ?>
Конструкция $_GET[«имя_параметра»] позволяет выводить значение переданного параметра.
В результате выполнения этого кода в браузере выведется:
Ваше имя: dima Ваш возраст: 27
мы тоже выполняем запрос к серверу методом GET.
Первый метод для выполнения 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
).
Имейте в виду, что он может быть больше или меньше, а также может быть ограничен настройками системы, на которой запускается PHP
.
Использование file_get_contents для получения URL-адреса сайта
Еще проще использовать этот метод при считывании файла по HTTP
, так как вам не придется заботиться о считывании по фрагментам — все обрабатывается в PHP
.
Данная публикация представляет собой перевод статьи «Making POST Requests With PHP
» , подготовленной дружной командой проекта
Сегодня мне немного захотелось ударится в примитивные вещи и описать то, что можно найти во всемирной сети в большом количестве и без особых трудов. Речь пойдет практически о святая святых протокола 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 запросы нужны для «общения» пользователя и сайта. Они по сути практически являются противоположностью друг друга. Использование тех или иных видов запросов зависит от конкретной ситуации и пользоваться только одним видом запроса крайне неудобно.
Применение методов GET
и POST
в PHP трудно переоценить, поскольку эти методы встречаются практически на каждом сайте. Прежде чем изучать ниже описанный материал, советую ознакомится с html тегом
. Рассмотрим каждый из этих методов в подробности.
Метод GET
Метод GET
использует для передачи данных строку URL. Возможно, Вы обращали внимание на длинные и непонятные URLы. Например: function.php?login=Alex&email=dezyakin
. В данном случае данные обрабатываются в function.php. После знака вопроса "?
" идет перечисление передаваемых параметров (параметр разделяются знаком "&") со значениями: параметру login присвоено значение Alex, а переменной email значение dezyakin. Данные будут хранится в суперглобальном массиве $_GET
. Приведем пример использования метода GET
представлен ниже:
Login
:
E-mail
:
С помощью суперглобального массива $_GET
выводим принятые значения:
*/
echo
" login = ". $_GET["login"]
;
echo
" email = ". $_GET["email"]
;
?>
Обратите внимание на то, как мы считываем значения из суперглобального массива $_GET: $_GET["имя_переменной"]
. В нашем примере имена переменных были объявлены в форме (name=login и name=email).
Совет
:
Прежде чем обрабатывать полученные значения советую проверять их на существование через функции isset(имя_переменной)
или empty(имя_переменной)
- эти функции были рассмотрены в предыдущем уроке 2: переменные в PHP . Например:
проверка на существование с помощью isset:
if
isset
($_GET["login"]
)
{
операторы для обработки login
...
}
//или же проверить на существование с помощью empty:
if
empty
($_GET["email"]
)
{
операторы для обработки email
...
}
?>
В форме можно указать имя файла, который будет обрабатывать передаваемые значения. Делается это с помощью атрибута формы action
, которому можно присвоить адрес этого файла. По умолчанию этот файл присвоен текущему файлу (т.е. обрабатывается в файле, где и расположена форма). Приведем пример, в котором данные из формы передаются на обработку в файл srcipt.php
:
Login
:
E-mail
:
В файле script.php должен содержатся какой-то обработчик информации, иначе информация будет передана в пустую.
Метод GET
обладает множеством недостатков:
Пользователь видит значения передаваемых параметров;
Пользователь может легко подделать передаваемые параметры;
Неудобная передача бинарной информации (приходится кодировать в текстовый формат);
Объем передаваемых данных ограничен - 8 Кбайт;
Из-за выше перечисленных недостатков метод GET
применяется только в тех случаях, когда нужно передать небольшой объем данных, а также эти данные никак не засекречены.
Метод POST
Метод POST
отличается от GET
тем, что данные передаются в закрытой форме. Существует суперглобальный массив $_POST
, из которого можно считывать данные следующим образом: $_POST["имя_переменной"]
. Например:
Login
: ">
E-mail
: ">
С помощью суперглобального массива $_POST
выводим принятые значения:
*/
echo
" login = ". $_POST["login"]
;
echo
" email = ". $_POST["email"]
;
?>
Результат выполнения выше описанного кода представлен на рисунке ниже:
Как видите URL не имеет никакой приписки, но тем не менее данные были получены и выведены.
Примечание
:
1) Объем передаваемых значений методом POST
по умолчанию ограничен и равен 8 Мбайт. Чтобы увеличить это значение нужно изменить директиву post_max_size
в php.ini.
2) В ранних версиях PHP вместо коротких названий суперглобальных массивов $_GET
и $_POST
использовались более длинные имена: $HTTP_GET_VARS
и $HTTP_POST_VARS
. По умолчанию они выключены в php 5, но Вы можете их включить в конфигурационном файле php.ini с помощью параметра register_long_arrays
. В php 6 версии эти длинные названия будут недоступны.
3) Перед обработкой переменных из $_POST
, советую проверять переменные на их наличие, также как это делалось с методом GET
.