(дистрибьютив Денвер) и вы научились писать простейшие программы на PHP, то самое время узнать, каким образом браузер (клиент) может делать серверу запросы и получать соответствующие ответы. На примере создания простой HTML-формы мы изучим основные принципы такого взаимодействия.
Если вы уже хорошо разбираетесь в каталогах Денвера, то можете создать любой PHP-файл в удобной для вас директории и приступить непосредственно к написанию кода. Для тех, кто еще не уверен в своих силах, советую поступить следующим образом: на виртуальном диске с Денвером (обычно это Z) в папке home создайте папку lessons . Далее, в этой папке создайте еще одну папку – www . Это ваша рабочая папка проекта, которая будет доступна из строки адреса браузера. Перезагрузите Денвер, чтобы созданный хост прописался в системе. Наконец, в папке www создайте файл index.php . Это и будет основной файл с вашим кодом.
Как видите – это обычная HTML-разметка, однако мы назвали файл index.php , а это значит, что теперь в документ мы можем вставлять любые инструкции на языке PHP.
Если вы теперь зайдете в браузере по адресу http://lessons/ , то увидите такой результат:
Заполните поля (например: имя – Вася, год рождения – 1990) и нажмите на кнопку "отправить". Что вы видите? А ничего! Опять та же форма, только пустая. Однако не спешите огорчаться – взгляните на адресную строку браузера. Она изменилась и теперь выглядит примерно вот так:
Http://lessons/index.php?user_name=Вася&user_year=1990&submit_form=отправить
А это значит, что сервер все-таки получил ваши данные!
Давайте теперь разберемся.
Метод GET
Во-первых, что вообще такое HTML-форма? Это интерфейс, позволяющий отправлять какие-либо данные с браузера клиента на сервер. Взгляните на атрибуты вашей формы:
Метод POST
Метод POST передает информацию через HTTP-заголовки. Информация кодируется, как описано в случае метода GET , и помещается в заголовок QUERY_STRING .
- Метод POST не имеет ограничений на размер данных, которые необходимо отправить.
- Метод POST может использоваться для отправки ASCII, а также двоичных данных.
- Данные, отправленные методом POST, проходят через HTTP-заголовок, поэтому безопасность зависит от протокола HTTP. Используя Secure HTTP, вы можете убедиться, что ваша информация защищена.
- PHP предоставляет ассоциативный массив $_POST для доступа ко всей отправляемой информации с использованием метода POST.
Попробуйте следующий пример, поместив исходный код в скрипт test.php .
if($_POST["name"] || $_POST["age"]) { if (preg_match("[^A-Za-z"-]",$_POST["name"])) { die ("invalid name and name should be alpha"); } echo "Welcome ". $_POST["name"]; echo "You are ". $_POST["age"]. " years old."; exit(); }
Переменная $_REQUEST
Переменная PHP $_REQUEST содержит содержимое как $_GET , $_POST , так и $_COOKIE . Мы обсудим переменную $_COOKIE , когда мы расскажем о файлах cookie.
Переменная PHP $_REQUEST может использоваться для получения результата из данных формы, отправленных с использованием методов GET и POST.
Всем привет! В этой статье мы рассмотрим, как обрабатывать POST запросы в NodeJS .
POST запросы отличаются от GET запросов, которые мы рассматривали в прошлых статьях, тем, что данные в них передаются в закрытом виде. Это очень часто используется для передачи информации из форм. В прошлой статье мы как раз-таки создали форму, давайте ее и будем использовать для обработки POST запросов.
Поскольку такого удобного метода, как query() , для POST запросов нет, нам нужно установить дополнение под названием Body Parser . Найти вы его можете и скачать на сайте NPM .
После того, как вы его скачали и установили, подключите расширение в файле app.js :
Var bodyParser = require("body-parser");
Теперь напишем следующий код:
Var urlencodedParser = bodyParser.urlencoded({extended: false});
Это middleware для POST запросов.
Теперь начнем получать и обрабатывать наш POST запрос:
App.post("/contact", urlencodedParser, function(req, res) {
res.render("contact-success", {data: req.body});
});
Этот код делает следующее: когда мы отправляем форму, она ссылается на страницу /contact (т.е. на саму себя) и отправляет туда POST запрос. Мы этот POST запрос перехватываем, используем наш парсер для того, чтобы сразу получить данные в нормальном виде, а затем отрисовываем страницу по шаблону contact-success (мы далее создадим этот шаблон), куда передаем объект data , содержащий объект, который вернулся из ответа метода парсера body() , со свойствами, равными именам полей формы(who , department , email ) и значениями, которые мы туда ввели. В общем-то, все просто и, благодаря парсеру, похоже на обработку GET запросов.
Теперь давайте создадим шаблон views/contact-success.ejs , куда скопируем весь код из файла contact.ejs . Удалим форму и в параграфе напишем следующее:
Спасибо за обращение!
Вы связались с <%= data.who %> из <%= data.department %> отдела
Мы ответим вам на email: <%= data.email %>
Думаю, тут все понятно и пояснять не нужно.
А на этом сегодня все. Мы закончили изучение платформы NodeJS , и теперь у вас есть вся необходимая база знаний для того, чтобы создавать отличные приложения на ее основе. Однако, чтобы закрепить знания, мы создадим список дел на NodeJS в ближайшее время! Не пропустите!
Содержимое формы кодируется точно так же, как для метода GET (см. выше), но вместо добавления строки кURL содержимое запроса посылается блоком данных как часть операцииPOST . Если присутствует атрибутACTION, то значениеURL , которое там находится, определяет, куда посылать этот блок данных. Этот метод, как уже отмечалось, рекомендуется для передачи больших по объему блоков данных.
Информация, введенная пользователем и отправленная серверу с помощью методаPOST , подается на стандартный ввод программе, указанной в атрибутеaction , или текущему скрипту, если этот атрибут опущен. Длина посылаемого файла передается впеременной окружения CONTENT_LENGTH, а тип данных – в переменнойCONTENT_TYPE.
Передать данные методом POST можно только с помощьюHTML-формы , поскольку данные передаются в теле запроса, а не в заголовке, как вGET . Соответственно и изменить значение параметров можно, только изменив значение, введенное в форму. При использованииPOST пользователь не видит передаваемыесерверу данные.
Основное преимущество POST запросов – это их большая безопасность и функциональность по сравнению с GET-запросами. Поэтому методPOST чаще используют для передачи важной информации, а также информации большого объема. Тем не менее не стоит целиком полагаться на безопасность этого механизма, поскольку данныеPOST запроса также можно подделать, например создав html-файл на своей машине и заполнив его нужными данными. Кроме того, не всеклиенты могут применять методPOST , что ограничивает варианты его использования.
При отправке данных на сервер любым методом передаются не только сами данные, введенные пользователем, но и ряд переменных, называемыхпеременными окружения , характеризующихклиента , историю его работы, пути к файлам и т.п. Вот некоторые изпеременных окружения :
REMOTE_ADDR – IP-адрес хоста (компьютера), отправляющего запрос;
REMOTE_HOST – имя хоста, с которого отправлен запрос;
HTTP_REFERER – адрес страницы, ссылающейся на текущий скрипт;
REQUEST_METHOD – метод, который был использован при отправке запроса;
QUERY_STRING – информация, находящаяся в URL после знака вопроса;
SCRIPT_NAME – виртуальный путь к программе, которая должна выполняться;
HTTP_USER_AGENT – информация о браузере, который использует клиент
Обработка запросов с помощью php
До сих пор мы упоминали только, что запросы клиента обрабатываются насервере с помощью специальной программы. На самом деле эту программу мы можем написать сами, в том числе и на языке PHP, и она будет делать с полученными данными все, что мы захотим. Для того чтобы написать эту программу, необходимо познакомиться с некоторыми правилами и инструментами, предлагаемыми для этих целей PHP.
Внутри PHP-скрипта имеется несколько способов получения доступа к данным, переданным клиентом по протоколуHTTP . До версии PHP 4.1.0 доступ к таким данным осуществлялся по именам переданных переменных (напомним, что данные передаются в виде пар «имя переменной, символ «=», значение переменной»). Таким образом, если, например, было переданоfirst_name=Nina, то внутри скрипта появлялась переменная$first_nameсо значениемNina. Если требовалось различать, каким методом были переданы данные, то использовались ассоциативные массивы$HTTP_POST_VARS и$HTTP_GET_VARS , ключами которых являлись имена переданных переменных, а значениями – соответственно значения этих переменных. Таким образом, если параfirst_name=Ninaпередана методомGET , то$HTTP_GET_VARS["first_name"]="Nina".
Использовать в программе имена переданных переменных напрямую небезопасно. Поэтому было решено начиная с PHP 4.1.0 задействовать для обращения к переменным, переданным с помощью HTTP-запросов, специальный массив – $_REQUEST . Этот массив содержит данные, переданные методамиPOST иGET , а также с помощьюHTTP cookies. Это суперглобальный ассоциативный массив, т.е. его значения можно получить в любом месте программы, используя в качестве ключа имя соответствующей переменной (элемента формы).
Пример 4.2. Допустим, мы создали форму для регистрации участников заочной школы программирования, как в приведенном выше примере. Тогда в файле1.php, обрабатывающем эту форму, можно написать следующее:
$str = "Здравствуйте,
".$_REQUEST["first_name"]. "
".$_REQUEST["last_name"]."!
";
$str .="Вы выбрали для изучения курс по
".$_REQUEST["kurs"];
Пример 4.2. Файл 1.php, обрабатывающий форму form.html (html , txt )
Тогда, если в форму мы ввели имя «Вася», фамилию «Петров» и выбрали среди всех курсов курс по PHP, на экране браузера получим такое сообщение:
Здравствуйте, Вася Петров!
После введения массива $_REQUEST массивы$HTTP_POST_VARS и$HTTP_GET_VARS для однородности были переименованы в$_POST и$_GET соответственно, но сами они из обихода не исчезли из соображений совместимости с предыдущими версиями PHP. В отличие от своих предшественников, массивы$_POST и$_GET стали суперглобальными, т.е. доступными напрямую и внутри функций и методов.
Приведем пример использования этих массивов. Допустим, нам нужно обработать форму, содержащую элементы ввода с именами first_name,last_name,kurs(например, формуform.html, приведенную выше). Данные были переданы методомPOST , и данные, переданные другими методами, мы обрабатывать не хотим. Это можно сделать следующим образом:
$str = "Здравствуйте,
".$_POST ["first_name"]."
".$_POST
["last_name"] ."!
";
$str .= "Вы выбрали для изучения курс по ".
Тогда на экране браузера, если мы ввели имя «Вася», фамилию «Петров» и выбрали среди всех курсов курс по PHP, увидим сообщение, как в предыдущем примере:
Здравствуйте, Вася Петров!
Вы выбрали для изучения курс по PHP
Для того чтобы сохранить возможность обработки скриптов более ранних версий, чем PHP 4.1.0, была введена директива register_globals , разрешающая или запрещающая доступ к переменным непосредственно по их именам. Если в файле настроек PHP параметрregister_globals=On, то к переменным, переданнымсерверу методамиGET иPOST , можно обращаться просто по их именам (т.е. можно писать$first_name). Если же register_globals=Off, то нужно писать $_REQUEST["first_name"] или $_POST["first_name"], $_GET["first_name"], $HTTP_POST_VARS["first_name"], $HTTP_GET_VARS["first_name"]. С точки зрения безопасности эту директиву лучше отключать (т.е.register_globals=Off). При включенной директивеregister_globals перечисленные выше массивы также будут содержать данные, переданныеклиентом .
Иногда возникает необходимость узнать значение какой-либо переменной окружения , например метод, использовавшийся при передаче запроса или IP-адрес компьютера, отправившего запрос. Получить такую информацию можно с помощью функцииgetenv() . Она возвращает значениепеременной окружения , имя которой передано ей в качестве параметра.
getenv("REQUEST_METHOD");
// возвратит использованный метод
echo getenv ("REMOTE_ADDR");
// выведет IP-адрес пользователя,
// пославшего запрос
Пример 4.3. Использование функции getenv() (html , txt )
Как мы уже говорили, если используется метод GET , то данные передаются добавлением строки запроса в виде пар «имя_переменной=значение кURL -адресу ресурса». Все, что записано вURL после знака вопроса, можно получить с помощью команды
getenv("QUERY_STRING");
Благодаря этому можно по методу GET передавать данные в каком-нибудь другом виде. Например, указывать только значения нескольких параметров через знак плюс, а в скрипте разбирать строку запроса на части или можно передавать значение всего одного параметра. В этом случае в массиве$_GET появится пустой элемент с ключом, равным этому значению (всей строке запроса), причем символ «+», встретившийся в строке запроса, будет заменен на подчеркивание «_».
Методом POST данные передаются только с помощью форм, и пользователь (клиент ) не видит, какие именно данные отправляютсясерверу . Чтобы их увидеть, хакер должен подменить нашу форму своей. Тогдасервер отправит результаты обработки неправильной формы не туда, куда нужно. Чтобы этого избежать, можно проверять адрес страницы, с которой были посланы данные. Это можно сделать опять же с помощью функцииgetenv() :
getenv("HTTP_REFERER");
Теперь самое время решить задачу, сформулированную в начале лекции.
Устройства