Использование методов GET и POST. Отправка данных формы

Обновлено 12.12.2015 г.

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

Итак, в этом уроке мы научимся делать форму отправки почтовых сообщений со страниц сайта с проверкой на правильность ввода данных . Т.е. если какое то поле формы будет не заполнено, то скрипт выдаст ошибку и сообщит об этом посетителю. Пример работы такой формы Вы можете увидеть . Если Вы заполните эту форму и нажмете кнопку: Отправить сообщение , то я получу Ваше послание.

Преимущество такой отправки сообщений очевидны:

1. Вам не нужно "светить в Интернете" свой почтовый адрес, а значит он не попадет к спамерам.

2. Если посетитель хочет задать Вам вопрос или что-то спросить ему не нужно, копировать адрес электронной почты, открывать свой почтовый клиент, писать сообщение и т.д. Посетитель быстро заполнит в форме нужные данные и отправит Вам сообщение.

3. При такой организации обратной связи с посетителями, вероятность доставки Вам сообщения почти 100%, особенно если почтовый адрес привязан к вашему домену. Ведь из длинной почтовой цепочки исключаются промежуточные узлы. А значит надежность доставки почты резко повышается.

Как создать форму отправки сообщений?

Как правило подобные скрипты состоят из двух частей и код расположен в двух разных файлах:

  • Первый файл - это сама форма, в которой заполняются данных сообщения.
  • Второй файл - это файл-обработчик, который получает данные из формы (первого файла) и отправляет по указанному в скрипте эл.адресу. Но работают эти части скрипта всегда обязательно в паре.

Первую часть скрипта мы выносим в отдельный файл и назовем его: mail.php . В этом файле будет располагаться форма ввода данных. Имя файла mail.php я взял условно, Вы можете назвать этот файл как угодно. Это файл может иметь и другое расширение, например .html .

Для обращения посетителей сайта к этому файлу, обычно делают простую ссылку: Написать автору сайта , Отправить сообщение или что нибудь в этом роде. Когда посетитель кликает по такой ссылке он попадает на отделную страницу с формой в которую нужно ввести данные (информацию) для отправки сообщения.

Итак, создаете новый файл, присвойте ему имя: mail.php или mail.html и вставляете в него код Листинга 1 .

Листинг 1









Для отправки сообщения автору сайта используйте следующую форму:



Ваше имя:


Ваш e-mail:


Ваше сообщение:




Это самая простая форма, состоящая всего из 3-х полей для ввода данных. Эти поля я назвал: Ваше имя , Ваш e-mail , Ваше сообщение . При необходимости количество полей можно увеличить.

Первых два поля: Ваше имя , Ваш e-mail , описываются тегами:

Ваше имя:

но каждому из них присваивается свое имя, которое называетмя идентификатор : name="name" и name="email" соотвественно.

Третье поле для ввода сообщения описано тегами:

Ваше сообщение:

Данное поле имеет идентификатор: name="mess" .

И естественно имеется две кнопки: Отправить сообщение и Очистить форму .

Данным (информации), которые посетитель заносит в форму, присваиваются соотвествующие идентификаторы: name , email и mess , запоминайте - это важно!

Для удобства оформления вся форма помещена в обычную таблицу, внешний вид, которой можно оформить с помощью , у меня это класс: class="td_border" , его я здесь не привожу, при необходимости допишите сами, на свой вкус.

Файл обработчик.

Вторая часть скрипта состоит из файла обработчика: mail2.php , в который методом POST передаются все данные с соответствующими идентификаторами: name , email и mess . Здесь эти данные помещаются в переменные: $name , $email , $mess .

Создаем файл mail2.php и прописываем в него код Листинга 2 :

Листинг 2

$name = $_POST["name"];
$email = $_POST["email"];
$mess = $_POST["mess"];

$REMOTE_ADDR = $_POST["REMOTE_ADDR"];

if (isset ($name))
{
$name = substr($name,0,20); //Не может быть более 20 символов
if (empty($name))
{
echo "

Не указано имя!!!

";
echo "";
exit;
}
}
else
{
$name = "не указано";
}

if (isset ($email))
{
$email = substr($email,0,20); //Не может быть более 20 символов
if (empty($email))
{
echo "

Не указан e-mail !!!

";
echo "Вернуться и правильно заполнить форму.";
exit;
}
}
else
{
$email = "не указано";
}

if (isset ($mess))
{
$mess = substr($mess,0,1000); //Не может быть более 1000 символов
if (empty($mess))
{
echo "

Сообщение не написано!!!

";
echo "Вернуться и правильно заполнить форму.";
exit;
}
}
else
{
$mess = "не указано";
}

$i = "не указано";
if ($name == $i AND $email == $i AND $mess == $i)
{
echo "Внимание! Произошла ошибка! Вы не заполнили поля сообщения!";
exit;
}

$to = "admin@сайт ";
$subject = "Сообщение с сайта сайт ";
$message = "Имя пославшего письмо: $name .\nЭлектронный адрес: $email\nСообщение: $mess .\nIP-адрес: $_SERVER";
mail ($to,$subject,$message,"Content-type:text/plain; charset = windows-1251 ") or print "Не могу отправить письмо!!!";
echo "

Спасибо за отправку Вашего сообщения.

Для меня это очень важно!

В ближайшее время Вы обязательно получите ответ.";
exit;
?>

В этом файле происходит проверка введенных посетителем сайта в форму данных, и последующая отправка сообщения по указанному адресу электронной почты.

При незаполненных полях или заполненных некорректно, скрипт вернет посетителю сообщение с указанием конкретной причины.

Обращаю Ваше внимание, что файл: mail2.php обязательно должен иметь расширение .php , т.к. отправка сообщения осуществляется с помощью функции mail PHP .

И естественно ваш Хостинг, должен поддерживать работу PHP. Это в основном касается бесплатных хостингов, хотя в последнее время даже на бесплатных Хостингах практически везде установлен PHP.

В коде Листинга 2 все просто, исправьте все значения, выделенные красным под свои требования, а именно:

  • пропишите свой адрес электронной почты , на который будут отправляться сообщения (переменная $to );
  • исправьте тему сообщения (переменная $subject );
  • обратите внимание на кодировку (charset = windows-1251 ). Кодировку пропишите ту, которая используется на вашем сайте. В русскоязычном интернете кодировка может быть: "utf-8" или "windows-1251" . Если ошибетесь с кодировкой текст в письме будет отображаться неправильно (кракозябрами).

Вот собственно говоря и все, теперь осталось закачать файлы: mail.php и mail2.php и на вашем сайте появится удобная форма для отправки сообщений.



Комментарии к этой статье (уроку):

Спасибо за урок. Вот правду говорят, что все приходит вовремя. Сегодня собиралась искать в инете как сделать форму контакта для сайта, причем независимую. Я так понимаю, что эта подойдет.

Хороший урок! Спасибо!

Спасибо Андрей, хороший урок.

Благодарствую, думаю пригодится

Вам пишет Савин Дмитрий Александрович (SAVIN DMITRY ALEXANDROVICH) ,хочу узнать все по подробнее о формах в CSS , я мало обэтом осведомлен: поподробнее о свойстве action , как я знаю action это ссылка на документ, куда отсылается запрос данных либо сами данные с формы, или что-то в этом роде.method="post" обработка данных в наибольших размерах нежели чем get и т. д.Пожалуйста подробнее о формах у меня в них почти просак.

Здравствуйте Андрей! С уважением к Вам Ахмад. Вот я тоже хочу на сайте создать "Добавить Ваш комментарий" чтобы посетители могли оставить свои Отзывы.Какой код писать мне? Спасибо Вам мне понравилось.Ахмад

Красавчик! очень полезная инфа!

Полезно, то полезно, но н запускаетсяю. После заполнения формы выдается листинг mail2.php

Полезно, то полезно, но не запускается. После заполнения формы выдается листинг mail2.php

Все хорошо работает, только кнопочки не получаются объемными как у автора. Может кто-то подскажет, как сделать объемные кнопочки? Автору спасибо!

а у меня не работает. точнее работает на половину. письмо отправляет, но пустое. данные из майл1 не переходят в майл2

На маил не приходит.В чем подвох? Я не пойму как он без логина и пароля чегонибуть отправит. Это что сервер почтовый типа? Простая форма и все

Спасибо за форму! Работает! У кого не работает - внимательно выполняйте каждый шаг. У меня тоже не сразу всё получилось. Андрей, ещё раз спасибо!

Помогите плиз, форму вставила всё вроде бы Ок, но на почту которую я указала сообщение не доходит, хотя и пишется сообщение отправлено...

Подскажите, а как сделать так, чтоб после отправки/неудачной отправке письма не открывалось новое окно а писалость в старом?

Андрей. Я понимаю, что обработчик вызывается. Я пока не особо в php разбираюсь. Но мне вот чего бы хотелось достич: страница с почтовой формой одна,т.е. после нажатия "Отправить сообщение" новое окно не открывается, а изменяется текущая страница. Т.е я так понимаю она динамическая. Самой пока не додуматься как сделать такое, поэтому спрашиваю совета.

Андрей, подскажите пожалуйста, форма замечательно работает в хроме, а вот с эксплорером проблема. Не доставляются письма и не выводятся сообщения об ошибках или отправке. В чем тут дело? Заранее спасибо

Классный урок! Спасибо!

Спасибо. Всё отлично работает)

в коде нет закрывающих тегов /p. Почему?

Warning: mail(): "sendmail_from" not set in php.ini or custom "From:" header missing in E:Roomsu362571transport-online.netwwwmail.php on line 66 Не могу отправить письмо!!! Во - как получается Как быть??

не могу разобраться с кодировкой. Если прописывать windows-1251 - текст скрипта в сообщении нормальный, сам текст сообщения на почту приходит крокозяброй. а если ставить utf-8 - текст скрипта в сообщении на почте - знаки вопроса, а текст сообщения из формы - нормальный. как сделать, что б и то и то нормальным было?

у меня неработает, но сайт еще не на хостинге, когда помещу-будет?

Все работает, спасибо за скрипт! Поскажите пожалуйста как сделать что бы при нажатии кнопки отправить не открывалась новая страница с обработчиком. Что бы сайт оставался на той странице где и был до нажатии кнопки отправить?

а как сделать поле ввода майл выше?

Если необходимо отправить письма на несколько адресов, просто через запятую дописываете нужные адреса вот так: $to = "admin@сайт, [email protected], [email protected]";

А как сделать чтобы после отправки сообщения была переадресация на другую страницу?

есть $to = "admin@сайт"; вопрос: если необходимиа отправка на 2-а адреса! один из адресов в виде $to = "$email"; другими словами функционал "посоветовать другу" с дублированием послания на мной заданную почту. Спасибо.

У меня почему-то форма обратной связи не работает, причём, никакая не работает. Делает вид, что сообщение отправлено, но на почту оно не приходит.

Здравствйте! Обьясните пожалуйста, почему не работает на хостинге, пишет: "Не могу отправить письмо". А на lockalhost на Денвере работает нормально. В чём проблема?...

почему у меня не одна формнеа не пашет пишет

Большое спасибо. Очень все просто и доступно. Я использовал Ваш пример на сайте gosdogovor.ru. Только немного подточил дизайн под себя и состав полей: http://www.gosdogovor.ru/easuzcon.html. Еще раз спасибо.

Ребят, если вы пытаетесь отправить сообщение с вашего локального сервера, тобишь с сайта еще не размещенном в инете, - у вас ничего не получится. Разместите на каком-то хостинге, и будет вам счастье)

Андрей, а как сделать так стобы при нажатии на кнопку отправлялось сообщение с определенным текстом на определенный адрес? Помогите пожалуйста: [email protected]

Лабораторная работа 1. Протокол HTTP. Методы GET, POST. HTML формы.

Теоретическая часть

Жизненный цикл запроса в протоколе HTTP

  1. Браузер открывает соединение с сервером
  2. Браузер отправляет серверу запрос на получение страницы
  3. Сервер формирует ответ (чаще всего - HTML-код) браузеру и закрывает соединение
  4. Браузер обрабатывает HTML-код и отображает страницу

Обратите внимание на выделенное жирным . Еще до того, как вы увидели на экране запрошенную страницу, соединение с сервером закрыто, и он о вас забыл. И когда вы введете другой (или тот же самый) адрес, или щелкните по ссылке, или нажмете на кнопку HTML-формы - та же схема повторится снова.

Такую схему работы называют "клиент-сервер" . Клиент в данном случае - браузер.

Итак, соединение с веб-сервером длится всего несколько секунд (или долей секунд) - это промежуток времени между щелчком по ссылке (или другим способом запроса) и началом отображения страницы. Большинство браузеров во время соединения отображают некий индикатор, например, MS Internet Explorer отображает анимацию в правом верхнем углу.

Чтобы навсегда избавиться от восприятия HTTP как "черного ящика", "притворимся" браузером с помощью telnet"а:

  1. Запустим telnet ya.ru 80
  2. Введем в окне терминала следующее (если ввод не отображается - ничего страшного):

GET / HTTP/1.0 [здесь нажмем Enter]
Host: ya.ru [здесь нажмем Enter дважды]

Нажатие Enter соответствует, как правило, комбинации символов CR + LF, обозначаемых как \r\n . Далее будет использоваться именно это обозначение.

По экрану пробежит HTML-код страницы http://ya.ru/. Как видите - ничего сложного.

Исходный код текущей страницы можно просмотреть практически в любом браузере, выбрав в меню "View|Source".

Картинки, фреймы - все это дополнительные запросы, точно такие же. Собственно, откуда берутся картинки в окне браузера: при парсинге (обработке) HTML-кода, браузер, натыкаясь на тэг https://i2.wp.com/картинка "> осуществляет дополнительный запрос к серверу - запрос картинки , и отображает ее на месте, где стоит тэг .



Попробуйте:

Telnet www.google.ru 80

GET /php/php5ru.png HTTP/1.0 \r\n
Host: ya.ru \r\n\r\n

По экрану пробежит то, что вы увидите, если просмотрите этот png-файл в текстовом редакторе.

I-2. HTML-формы. Методы отправки данных на сервер

С HTML-формами вы наверняка уже встречались:

  1. Введите Ваше имя:

Сохранив данный код в HTML-файле и просмотрев его с помощью вашего любимого браузера, вы увидите привычную HTML-форму:

Введите Ваше имя:

Рассмотрим используемые в этом небольшом примере тэги подробнее.

Тэг

, имеющий парный завершающий тэг
, собственно и задает форму. Его атрибуты - оба необязательные:

  • action - указывает URL (полный или относительный), на который будет отправлена форма. Отправка формы - это такой же запрос к серверу, как и все остальные (как я уже описал выше).

Если этот атрибут не указать, большинство браузеров (точнее говоря, все известные мне браузеры) отправляют форму на текущий документ, то есть "саму на себя". Это удобное сокращение, но по стандарту HTML атрибут action обязателен.

  • method - способ отправки формы. Их два.
    • GET - отправка данных формы в адресной строке.
      Вы могли заметить на различных сайтах присутствие в конце URL символа "?" и следующих за ним данных в формате параметр=значение . Здесь "параметр" соответствует значению атрибута name элементов формы (см. ниже про тэг ), а "значение" - содержимому атрибута value (в нем, например, содержится ввод пользователя в текстовое поле того же тэга ).
      Для примера - попробуйте поискать что-нибудь в Яндексе и обратите внимание на адресную строку браузера. Это и есть способ GET.
    • POST - данные формы отправляются в теле запроса . Если не совсем понятно (или совсем непонятно), что это такое - не беспокойтесь, скоро мы к этому вопросу вернемся.

Если атрибут method не указан - подразумевается "GET".

Тэг - задает элемент формы , определяемый атрибутом type :

  • Значение "text" задает однострочное текстовое поле ввода
  • Значение "submit" задает кнопку, при нажатии которой происходит отправка формы на сервер

Возможны и другие значения (да и - не единственный тэг, задающий элемент формы), но их мы рассмотрим в следующих главах.

Итак, что же происходит, когда мы нажимаем кнопку "OK"?

  1. Браузер просматривает входящие в форму элементы и формирует из их атрибутов name и value данные формы . Допустим, введено имя Vasya . В этом случае данные формы - name=Vasya&okbutton=OK
  2. Браузер устанавливает соединение с сервером, отправляет на сервер запрос документа, указанного в атрибуте action тэга
    , используя метод отправки данных, указанный в атрибуте method (в данном случае - GET), передавая в запросе данные формы.
  3. Сервер анализирует полученный запрос, формирует ответ, отправляет его браузеру и закрывает соединение
  4. Браузер отображает полученный от сервера документ

Отправка того же запроса вручную (с помошью telnet) выглядит следующим образом (предположим, что доменное имя сайта - www.example.com):

telnet www.example.com 80

GET /cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK HTTP/1.0 \r\n
Host: www.example.com \r\n
\r\n

Как вы, скорее всего, уже догадались, нажатие submit-кнопки в форме с методом отправки "GET" аналогично вводу соответствующего URL (со знаком вопроса и данными формы в конце) в адресной строке браузера: http://www.example.com/cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK

На самом деле, метод GET используется всегда, когда вы запрашиваете с сервера какой-либо документ, просто введя его URL, или щелкнув по ссылке. При использовании , к URL просто добавляются знак вопроса и данные формы.

Теперь заменим первую строку нашей формы на следующую:

Мы указали метод отправки "POST". В этом случае данные отправляются на сервер несколько другим способом:

telnet www.example.com 80

POST /cgi-bin/form_handler.cgi HTTP/1.0 \r\n
Host: www.example.com \r\n
Content-Type: application/x-www-form-urlencoded \r\n
Content-Length: 22 \r\n
\r\n
name=Vasya&okbutton=OK

При использовании метода POST данные формы отправляются уже после "двух Enter-ов" - в теле запроса. Все, что выше - на самом деле заголовок запроса (и когда мы использовали метод GET, данные формы отправлялись в заголовке). Для того, чтобы сервер знал, на каком байте закончить чтение тела запроса, в заголовке присутствует строка Content-Length ; о том же, что данные формы будут переданы виде параметр1=значение1&параметр2=значение2... , причем значения передаются в виде urlencode - то есть, точно так же, как и с помощью метода GET, но в теле запроса, - серверу сообщает заголовок "Content-Type: application/x-www-form-urlencoded".

Преимущество метода POST - отсутствие ограничения на длину строки с данными формы.

При использовании метода POST невозможно отправить форму, просто "зайдя по ссылке", как было с GET.

При использовании POST-формы, в ее атрибуте action можно указать после знака вопроса и параметры GET-формы. Таким образом, метод POST включает в себя и метод GET.

HTML-формы. Массивы $_POST и $_GET

HTML-формы. Методы отправки данных на сервер

С HTML-формами вы наверняка уже встречались:

Введите Ваше имя:

Сохранив данный код в HTML-файле и просмотрев его с помощью вашего любимого браузера, вы увидите привычную HTML-форму:

Введите Ваше имя:

Тэг

, имеющий парный завершающий тэг
, собственно и задает форму. Его атрибуты - оба необязательные:

  • action - указывает URL (полный или относительный), на который будет отправлена форма. Если этот атрибут не указать, большинство браузеров (точнее говоря, все известные мне браузеры) отправляют форму на текущий документ, то есть "саму на себя". Это удобное сокращение, но по стандарту HTML атрибут action обязателен.
  • method - способ отправки формы. Их два.
    • GET - отправка данных формы в адресной строке.
      Вы могли заметить на различных сайтах присутствие в конце URL символа "?" и следующих за ним данных в формате параметр=значение. Здесь "параметр" соответствует значению атрибута name элементов формы (см. ниже про тэг ), а "значение" - содержимому атрибута value (в нем, например, содержится ввод пользователя в текстовое поле того же тэга ).
      Для примера - попробуйте поискать что-нибудь в Яндексе и обратите внимание на адресную строку браузера. Это и есть способ GET.
    • POST - данные формы отправляются в теле запроса. Если не совсем понятно (или совсем непонятно), что это такое - не беспокойтесь, скоро мы к этому вопросу вернемся.
    Если атрибут method не указан - подразумевается GET .

Тэг - задает элемент формы, определяемый атрибутом type:

  • Значение "text" задает однострочное текстовое поле ввода
  • Значение "submit" задает кнопку, при нажатии которой происходит отправка формы на сервер

Возможны и другие значения (да и - не единственный тэг, задающий элемент формы).

Итак, что же происходит, когда мы нажимаем кнопку "OK"?

  1. Браузер просматривает входящие в форму элементы и формирует из их атрибутов name и value данные формы. Допустим, введено имя Vasya . В этом случае данные формы - name=Vasya&okbutton=OK
  2. Браузер устанавливает соединение с сервером, отправляет на сервер запрос документа, указанного в атрибуте action тэга
    , используя метод отправки данных, указанный в атрибуте method (в данном случае - GET), передавая в запросе данные формы.
  3. Сервер анализирует полученный запрос, формирует ответ, отправляет его браузеру и закрывает соединение
  4. Браузер отображает полученный от сервера документ

Отправка того же запроса вручную (с помошью telnet) выглядит следующим образом (предположим, что доменное имя сайта - www.example.com):

Telnet www.example.com 80 GET /cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK HTTP/1.0\r\n Host: www.example.com\r\n \r\n

Как вы, скорее всего, уже догадались, нажатие submit-кнопки в форме с методом отправки "GET" аналогично вводу соответствующего URL (со знаком вопроса и данными формы в конце) в адресной строке браузера:

Http://www.example.com/cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK

На самом деле, метод GET используется всегда, когда вы запрашиваете с сервера какой-либо документ, просто введя его URL, или щелкнув по ссылке. При использовании , к URL просто добавляются знак вопроса и данные формы.

Возможно, все эти технические подробности и упражнения с telnet-ом кажутся вам невероятно скучными и даже ненужными ("а при чем тут PHP?"). А зря. :) Это основы работы по протоколу HTTP, которые необходимо знать назубок каждому Web-программисту, и это не теоретические знания - все это пригодится на практике.

Теперь заменим первую строку нашей формы на следующую:

Мы указали метод отправки "POST". В этом случае данные отправляются на сервер несколько другим способом:

Telnet www.example.com 80 POST /cgi-bin/form_handler.cgi HTTP/1.0\r\n Host: www.example.com\r\n Content-Type: application/x-www-form-urlencoded\r\n Content-Length: 41263\r\n \r\n name=Vasya&okbutton=OK

При использовании метода POST данные формы отправляются уже после "двух Enter-ов" - в теле запроса. Все, что выше - на самом деле заголовок запроса (и когда мы использовали метод GET, данные формы отправлялись в заголовке). Для того, чтобы сервер знал, на каком байте закончить чтение тела запроса, в заголовке присутствует строка Content-Length ; о том же, что данные формы будут переданы виде параметр1=значение1&параметр2=значение2... , причем значения передаются в виде urlencode - то есть, точно так же, как и с помощью метода GET , но в теле запроса, - серверу сообщает заголовок Content-Type: application/x-www-form-urlencoded .

Преимущество метода POST - отсутствие ограничения на длину строки с данными формы.

При использовании метода POST невозможно отправить форму, просто "зайдя по ссылке", как было с GET .

При использовании POST -формы, в ее атрибуте action можно указать после знака вопроса и параметры GET -формы. Таким образом, метод POST включает в себя и метод GET .

Массивы $_GET и $_POST

Итак, формы являются основным способом обмена данными между веб-сервером и браузером, то есть обеспечивают взаимодействие с пользователем - собственно, для чего и нужно веб-программирование.

Рассмотрим простой пример:



if ($_SERVER [ "REQUEST_METHOD" ] == "POST" ) {
echo "

Привет, " . $_POST [ "name" ] . "

!" ;
}
?>
">
Введите Ваше имя:




Форма, приведенная в строках 8-12, содержит два элемента: name и okbutton . Атрибут method указывает метод отправки формы POST , атрибут же action , указывающий URL, на который отправляется форма, заполняется значением серверной переменной PHP_SELF - адресом выполняемого в данный момент скрипта.

- сокращенная форма записи для .

Предположим, в поле name мы ввели значение Вася, и нажали кнопку OK. При этом браузер отправляет на сервер POST -запрос. Тело запроса: name=Вася&okbutton=OK . PHP автоматически заполняет массив $_POST:

$_POST [ "name" ] = "Вася"
$_POST [ "okbutton" ] = "OK"

В действительности, значение "Вася" отправляется браузером в urlencode-виде; для кодировки windows-1251 это значение выглядит как %C2%E0%F1%FF . Но, поскольку PHP автоматически осуществляет необходимое декодирование, мы можем "забыть" об этой особенности - пока не придется работать с HTTP-запросами вручную.

Так как в теле запроса указываются только имена и значения, но не типы элементов форм, PHP понятия не имеет, соответствует $_POST["name"] строке ввода, кнопке, или списку. Но эта информация нам, в общем-то, совершенно не нужна. :)

Поскольку знать, что написано на кнопке submit, нам необязательно, в строке 11 можно удалить атрибут name , сократив описание кнопки до . В этом случае, браузер отправит POST -запрос name=Вася.

А теперь - то же самое, но для GET-формы:



if (isset($_GET [ "name" ])) {
echo "

Привет, " . $_GET [ "name" ] . "

!" ;
}
?>
">
Введите Ваше имя:





В строке 8 можно было бы с таким же успехом написать

: GET - метод по умолчанию. В этот раз браузер отправляет GET -запрос, который равносилен вводу в адресной строке адреса: http://адрес-сайта/имя-скрипта.php?name=Вася.

PHP с GET -формами поступает точно так же, как и с POST , с тем отличием, что заполняется массив $_GET .

Кардинальное же отличие - в строке 4. Поскольку простой ввод адреса в строке браузера является GET-запросом, проверка if ($_SERVER["REQUEST_METHOD"] == "GET") бессмысленна. Поэтому мы прибегаем к конструкции isset() , которая возвращает true , если данная переменная определена (т.е. ей было присвоено значение), и false - если переменная не определена. Если форма была заполнена - как вы уже поняли, PHP автоматически присваивает $_GET["name"] соответствующее значение.

Cпособ проверки с помощью isset() - универсальный, его можно было бы использовать и для POST -формы. Более того, он предпочтительнее, так как позволяет выяснить, какие именно поля формы заполнены.

Немного более сложный пример.




echo "Укажите имя!
" ;
< 1900 || $_POST [ "year" ] > 2004 ) {
echo
"
;
} else {

" ;

echo "Вам " . $age . " лет
" ;
}
echo "


" ;
}
?>
">
Введите Ваше имя:


Введите Ваш год рождения:





Никаких новых приемов здесь не используется. Разберитесь, выполните код, попробуйте модифицировать...

Изменим последний пример, чтобы пользователю не нужно было повторно заполнять поля. Для этого заполним атрибуты value элементов формы только что введенными значениями.



$name = isset($_POST [ "name" ]) ? $_POST [ "name" ] : "" ;
$year = isset($_POST [ "year" ]) ? $_POST [ "year" ] : "" ;

If (isset($_POST [ "name" ], $_POST [ "year" ])) {
if ($_POST [ "name" ] == "" ) {
echo "Укажите имя!
" ;
} else if ($_POST [ "year" ] < 1900 || $_POST [ "year" ] > 2004 ) {
echo "Укажите год рождения! Допустимый диапазон значений: 1900..2004
"
;
} else {
echo "Здравствуйте, " . $_POST [ "name" ] . "!
" ;
$age = 2004 - $_POST [ "year" ];
echo "Вам " . $age . " лет
" ;
}
echo "


" ;
}
?>
">
Введите Ваше имя:


Введите Ваш год рождения:





Несколько непонятными могут оказаться строки 4 и 5. Все очень просто: строку 4 можно было бы записать так:

if (isset($_POST [ "name" ]))
$name = $_POST [ "name" ];
else
$name = "" ;

Может возникнуть вопрос - почему бы не выбросить строки 4-5 и не написать:

Введите Ваше имя: ">

Введите Ваш год рождения: ">

Дело в том, что, если эти POST -переменные не определены - а так и будет, если форму еще не заполняли, - PHP выдаст предупреждения об использовании неинициализированных переменных (причем, вполне обоснованно: такое сообщение позволяет быстро находить труднообнаружимые опечатки в именах переменных, а также предупреждает о возможных "дырах" на сайте). Можно, конечно, поместить код с isset прямо в форму, но получится слишком громоздко.

Разобрались? А теперь попробуйте найти ошибку в приведенном коде. Ну, не совсем ошибку, - но недочет.

htmlspecialchars()

Не нашли? Я подскажу. Введите, например, в поле "имя" двойную кавычку и какой-нибудь текст, например, Ва"ся. Отправьте форму, и взгляните на исходный код полученной страницы. В четвертой строке будет что-то наподобие:

Введите Ваше имя:

То есть - ничего хорошего. А если бы хитрый пользователь ввел JavaScript-код?

Для решения этой проблемы необходимо воспользоваться функцией htmlspecialchars() , которая заменит служебные символы на их HTML-представление (например, кавычку - на "):



$name = isset($_POST [ "name" ]) ? htmlspecialchars ($_POST [ "name" ]) : "" ;
$year = isset($_POST [ "year" ]) ? htmlspecialchars ($_POST [ "year" ]) : "" ;

If (isset($_POST [ "name" ], $_POST [ "year" ])) {
if ($_POST [ "name" ] == "" ) {
echo "Укажите имя!
" ;
} else if ($_POST [ "year" ] < 1900 || $_POST [ "year" ] > 2004 ) {
echo "Укажите год рождения! Допустимый диапазон значений: 1900..2004
"
;
} else {
echo "Здравствуйте, " . $name . "!
" ;
$age = 2004 - $_POST [ "year" ];
echo "Вам " . $age . " лет
" ;
}
echo "


" ;
}
?>
">
Введите Ваше имя:


Введите Ваш год рождения:





Повторите опыт и убедитесь, что теперь HTML-код корректен.

Запомните - функцию htmlspecialchars() необходимо использовать всегда, когда выводится содержимое переменной, в которой могут присутствовать спецсимволы HTML.

phpinfo()

Функция phpinfo() - одна из важнейших в PHP. Она выводит информацию о настройках PHP, значения всевозможных конфигурационных переменных...

Почему я упоминаю о ней в статье, посвященной формам? phpinfo() - удобнейшее средство отладки. phpinfo() , помимо прочего, выводит значения всех $_GET , $_POST и $_SERVER переменных. Так что, если переменная формы "потерялась", самый простой способ обнаружить, в чем дело - воспользоваться функцией phpinfo() . Для того, чтобы функция выводила только значения переменных (и вам не пришлось прокручивать десяток страниц), ее следует вызвать следующим образом: phpinfo(INFO_VARIABLES); , или - что абсолютно то же самое - phpinfo(32) ;.



">
Введите Ваше имя:


phpinfo (32 );
?>

Или, например, такая ситуация: вы хотите узнать IP-адрес посетителя. Вы помните, что соответствующая переменная хранится в массиве $_SERVER , но - вот незадача - забыли, как именно переменная называется. Опять же, вызываем phpinfo(32); , ищем в табличке свой IP-адрес и находим его - в строке $_SERVER["REMOTE_ADDR"] .

Применение методов 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 .

Многие веб приложения используют формы чтобы для сбора данных и отправки данных на сервер. Формы обычно содержат несколько элементов для ввода данных различного типа, например имени, адреса, даты рождения email адрес и так далее. HTML поддерживает несколько типов элементов ввода включая текстовые поля, радио кнопки и чекбоксы. В HTML5 добавлено больше специальных элементов, таких как email, поле для пароля, выбор цвета, виджеты для отображения даты и времени, бегунки.

Главный пример этого руководства содержит клиенскую и серверную часть. Клиентская часть использует Polymer для предоставления пользовательского интерфейса (формы содержат множество типов элементов ввода) и интерфейс синхронизации данных с Dart. Клиент и сервер общаются используя некоторые классы из различных библиотек, включаю потоки, флючерсы, HttpRequest и так далее. Сервер использует заголовки CORS для использования кросс-доменных запросов.

Замечание эта статья основывается на том что вы прочитали в разделах: Cоздание собственных элементов , Использование API для фьючерсов Динамическая обработка данных , а так же вы должны быть знакомы с библиотекой Polymer, фьючерсами, JSON и HttpRequest.

Общая информация о формах

У форм есть свойство action , представляющий собой URL для отправки данных формы, и method который определяет как данные должны быть отправлены. Свойства action и method могут быть определены непосредственно в HTML, или в более сложном случае или чтобы получить больше контроля, Вы можете написать код Dart и использовать библиотеки Dart для предоставления этих свойств программно

Давайте начнем с основ, только с HTML форм, чтобы разобраться в свойствах action и method элементов ввода и понять стандартное поведение форм. Форма ниже, заключенная в тэг

, используется для поиска данных, введенных пользователем, в Google. Информация ищется по сайту, если чекбокс выбран (и в интернете если нет). Этот пример, названный search_form, по умолчанию ищет полезные ресурсы “cookbook” на сайте dartlang.org.

вот HTML код для создания формы:

Использование атрибутов action и method.

А вот HTML код которые добавляет в форму три элемента ввода - текстовое поле, кнопка отправки и чекбокс.

Чекбокс обернут в тэг label, поэтому вы можете нажимать как на сам чекбокс так и на заголовок, чтобы изменить значение.

Этот HTML код предоставляет некоторое автоматическое поведение.

****

Создает специальную кнопку, нажатие которой вызывает отправку данных формы. На основании атрибутов action и method, кнопка формирует запрос и отправляет его на сервер по указанному URL.

**name=q** **name="sitesearch"**

определяет имя текстового поля и имя чекбокса.

Для элементов внутри формы, у которых указано имя предоставляют данные для этой формы. В данном примере, значение предоставляемое текстовым полем это значение для q , а чекбокс предоставляет значение для sitesearch , оба этих параметра являются частью корректного URL для запроса Google. Когда пользователь нажимает кнопку, имя и соответствующее значение добавляется к URL для поиска. Вот пример запроса:

Http://www.google.com/search?q=Cookbook&sitesearch=dartlang.org

Этот пример полностью создан без использования кода Dart или Javascript. Потому как он очень прост, он может использовать обычное поведение HTML: публично доступный и прост для формирования URL, а так же обычный GET запрос. Для форм, которые содержать большое количество данных, или для web приложения, которое общается со специализированным сервером, вам обычно надо обрабатывать форму программно.

Следующий пример показывает более сложную форму, которая программно отправляет данные на сервер, используя POST запрос.

Пример slambook в частности

Этот раздел включает две программы в качестве основных примеров.

    Первая, это обычная серверная программа, названная slambookserver, которая слушает на локальном компьютере порт 4040 и обрабатывает запросы POST и OPTIONS создавая сообщения и отправляя подтверждение клиенту. Сервер использует заголовки CORS для того чтобы разрешить приложению использовать запросы отправленные с других серверов.

    Вторая, это клиентская программа, названная slambook, предоставляющая форму, в которой пользователь может вводить информацию. Эта программа использует Polymer для двойной связи данных, между элементами ввода и переменными Dart. Когда пользователь нажимает кнопку, код Dart преобразует данные в строку JSON, отправляет запрос OPTIONS чтобы получить разрешение сервера, а затем отравляет POST запрос для отправки данных. Когда запрос от сервера получен, он отображается клиенту.

Следующая диаграмма показывает последовательность общения между сервером и клиентом в данном примере.


Попробуйте! Введите любые данные и нажмите кнопку Отправить .

Замечание о версии . Приложение slambook совместимо с polymer.dart 0.9.

Запрос возвращает сообщение “No server” потому что вы не запустили сервер на своей машине. Давайте это исправим.

Запуск сервера

Исходный код основной серверной программы slambookserver.dart можно скачать из примеров руководства

Запустите серверную программу из командной строки

% dart slambookserver.dart Listening for GET and POST on http://127.0.0.1:4040

Теперь Вы снова можете попробовать отправить данные из приложения slambook выше.

Замечание : Если какая-то другая программа уже использует порт 4040, сервер вернет сообщение об ошибке и завершит выполнение. Программа на этой странице рассчитывает что slambookserver будет расположен на локальной машине, порт 4040. Поэтому чтобы приложение могло работать вы должны завершить другой процесс и снова запустить slambookserver. Или вы можете изменить номер порта в серверной и клиентской программе. Избегайте использования 3030, так как его использует Dart Editor. Затем запустите клиент и сервер на вашем локальном компьютере.

Оставшаяся часть этого руководства поясняет код сервера и клиента.

О клиентской части Вы узнаете об:

    Отправке данных формы

    Сброс формы

    Использовании Polymer для связи данных формы

Серверная часть в этом разделе расскажет о:

    Заголовках CORS

    Обработке запросов OPTIONS

    Обработке запросов POST

Отправка данных формы

Первым делом давайте взглянем на то как данные отправлены на сервер.

Напомним что пример search_form был основан на использовании атрибутов action и method для задания назначения и метода, для отправки формы. Также напомним что пример search_form основывается на автоматическом поведении специальной кнопки отправки. С другой стороны, пример slambook принимает непосредственное участие в процессе отправки:

    Во-первых в форме не определен ни action ни method

    Во-вторых у кнопки отправки данных есть обработчик нажатия в Dart

    В-третьих обработчик нажатия переопределяет автоматическое поведение кнопки отправки

    И наконец данные формы отправляются на сервер при помощи библиотек Dart

Форма в примере slambook представлена пользовательским элементом tute-slambook-form , который представлен следующим кодом HTML:

Обратите внимание на отсутствие атрибутов action и method. Вместо этого поведение кнопки отправки определено в обработчике нажатия кнопки в Dart. Ниже представлен HTML код, который создает кнопку отправки и связывает ее с обработчиком Dart.

А вод и сам код обработчика нажатия кнопки submitForm():


Давайте рассмотрим каждый элемент кода обработчика

Отмена стандартного обработчика

Это событие без атрибутов action и method , кнопка отправки содержит автоматическое поведение, которое не нужно в примере slambook. Поэтому в первой строке кода обработчика вызывается e.preventDefault(), чтобы отменить поведение кнопки по умолчанию.

Void submitForm(Event e) { e.preventDefault(); // Don"t do the default submit. … }

Настройка и отправка POST запроса

Следующая часть кода создает объект HttpRequest . В этом коде используется new чтобы создать экземпляр объекта HttpRequest, который используется чтобы настроить и отправить POST запрос. Класс HttpRequest имеет соответствующую функцию getString(), чтобы Вы могли использовать и отправлять обычные GET запросы к URL.

Следующая строка предоставляет объекту HttpRequest колбэк функцию, названную onData , которая вызывается при получении ответа от сервера. Мы рассмотрим детали объявления функции onData() позже.

Важно : Вы должны зарегистрировать колбэк функцию до отправки запроса!

Request = new HttpRequest(); request.onReadyStateChange.listen(onData); var url = "http://127.0.0.1:4040"; request.open("POST", url); request.send(slambookAsJsonData());

И наконец функция отправляет данные формы на сервер в виде JSON строки. Иногда данные отправляются по частям. Но этот пример достаточно мал, чтобы данные отправлялись за раз. Этот запрос является асинхронным, поэтому метод send() завершится как только запрос будет отправлен.

Ожидание ответа от сервера

Объект HttpRequest общается с сервером. Вы можете получить состояние используя поле readyState объекта HttpRequest. Состояние готовности может принимать пять различных значений: не отправлено (unsent), открыто (opened), заголовки получены (headers received), загрузка (loading) и выполнено (done). Когда состояние готовности меняется, HttpRequest вызывает событие, и вызывается колбэк функция onData().

Напомним строчку кода, в которой регистрируется обработчик события onReadyStateChange :

Request.onReadyStateChange.listen(onData);

Единственным требуемым аргументом метода listen() является колбэк функция с сигнатурой: void onData(T) . Метод listen() также позволяет вам определить три дополнительных аргумента, например обработчик ошибок.

Ниже колбэк функция onData():

Void onData(_) { if (request.readyState == HttpRequest.DONE && request.status == 200) { // Data saved OK. serverResponse = "Server Sez: " + request.responseText; } else if (request.readyState == HttpRequest.DONE && request.status == 0) { // Status is 0...most likely the server isn"t running. serverResponse = "No server"; } }

Первым делом в коде проявляется завершился ли успешно запрос. Если да то содержание ответа помещается в строку названную serverResponse , которая привязана к значению элемента textarea приложения slambook. При изменении строки интерфейс пользователя будет автоматически обновлен, о сообщение будет показано пользователю.

Если запрос выполнен с ошибкой, то программа выведет в serverResponse сообщение об ошибке, которое будет показано пользователю.

Сброс данных из формы

Кнопка сброса это специальный элемент ввода HTML, который по умолчанию очищает значения введенные в эту форму. Мы же вместо этого хотим чтобы кнопка сбрасывала значения формы к первоначальным. Поэтому, обработчик нажатия для кнопки сброса нуждается в отмене автоматического поведения и явно заполнить данные.

Void resetForm(Event e) { e.preventDefault(); favoriteThings["kittens"] = false; favoriteThings["raindrops"] = false; favoriteThings["mittens"] = false; favoriteThings["kettles"] = false; theData["firstName"] = ""; theData["favoriteQuote"] = ""; theData["favoriteColor"] = "#FFFFFF"; theData["birthday"] = "2013-01-01"; theData["volume"] = "0"; theData["catOrDog"] = "cat"; theData["music"] = 0; theData["zombies"] = false; serverResponse = "Data reset."; }

Создание серверной части и прослушивание порта

Теперь давайте обратим рассмотрим серверную часть, которая называется slambookserver , она возвращает HTTP ответ, на запрос отправленный из клиентского приложения slambook. Код серверной части основывается на статье [Использование Dart для создания JSON Web сервисов (#)

Сервер слушает порт 4040 на локальной машине и обрабатывать только запросы типа POST и OPTIONS. Оба типа запросов используют для разрешения доступа CORS заголовки. Для POST запросов, сервер возвращает короткое сообщение о подтверждении, которое включает данные в формате JSON которые он получил из запроса.

Давайте взглянем на код.

Функция main() приложения slambookserver приведена полностью чуть ниже. Используя класс HttpServer приложение slambookserver начинает прослушивание порта 4040 локальной машины после вызова функции верхнего уровня bind ()

Final HOST = "127.0.0.1"; final PORT = 4040; void main() { HttpServer.bind(HOST, PORT).then(gotMessage, onError: printError); }

Функция bind() возвращает фьючерс, при помощи которого можно получить значение в будущем (больше информации будет буквально через минуту). Функция then() регистрирует две колбэк функции в виде фьючерса. Первая функция gotMessage(), вызывается когда фьючерс получает значения. Вторая printError вызывается при неудачной попытке соединения. Ошибка может возникнуть, например, если другая программа уже слушает тот-де порт.

Фильтрация запросов и вызов остальных методов для обработки каждого типа запроса функции gotMessage () ниже.

Void gotMessage(_server) { _server.listen((HttpRequest request) { switch (request.method) { case "POST": handlePost(request); break; case "OPTIONS": handleOptions(request); break; default: defaultHandler(request); } }, onError: printError); // Listen failed. print("Listening for GET and POST on http://$HOST:$PORT"); }

Для обработке других типов запросов, таких как GET, вы можете просто добавить больше значений в case например case ‘GET’ .

Немного о фьючерсах.

Давайте немного рассмотрим фьючерсы, до того как будем разбираться с кодом обработки POST и OPTIONS запросов.

Фьючерс представляет способ получения значения через некоторое время в будущем. Вы используете фьючерсы для предотвращения блокировки программы пока она ожидает данные, например если необходимы долгие вычисления для предоставления значения, или если значение должно быть прочитано или получено с использованием ввода/вывода.

Когда вызывается функция возвращающая фьючерс, происходит две вещи

    Функция помещается в очередь на выполнение и немедленно возвращает незавершенный объект фьючерс.

    Позже, когда значение получено, объект фьючерса завершается с полученным значением или с ошибкой.

Чтобы получить значение возвращаемое фьючерсом используется метод then () для регистрации колбэка.

В этом примере и клиентская и серверная часть использует фьючерсы для отправки запросов и получения соответствующих ответов. Программы типа клиент-сервер почти всегда используют фьючерсы для общения и других видов асинхронного ввода вывода.

Обработка запросов OPTIONS

С помощью класса HttpRequest , клиентское приложение slambook отправляет запросы, когда пользователь нажимает кнопку “отправить”. Вы видели код ранее в этой статье.

Если клиента и сервера различное происхождение, что является общим в приложениях, перед POST отправляется предварительный запрос. Предварительный запрос должен в первую очередь содержать OPTIONS запрос чтобы определить какие вообще запросы разрешены. Класс HttpRequest автоматически обрабатывает предварительные запросы OPTIONS. Вам больше не надо для этого писать код на стороне клиента.

Сервер получает предварительный запрос OPTIONS до того как получает основной запрос. Вот код приложения slambookserver который обрабатывает OPTIONS запросы.

Void handleOptions(HttpRequest req) { HttpResponse res = req.response; addCorsHeaders(res); print("${req.method}: ${req.uri.path}"); res.statusCode = HttpStatus.NO_CONTENT; res.close(); }

Этот код выполняет следующее:

    Получает объект HttpResponse, который заботится о том чтобы сервер послал ответ клиенту

    Добавляет CORS заголовки для управления доступом

    Выводит сообщение в консоль

    Сигнализирует о том, что у ответ нет содержания

    Завершает ответ, который будет отправлен клиенту.

Когда клиент получает запрос, CORS заголовок сигнализирует о том, запросы POST будут приняты.

Настройка CORS заголовков

Серверное приложение использует следующую функцию для добавления в ответ CORS заголовков для OPTIONS и POST запросов. Функция добавляет ответ сервера три заголовка Access-Control (которые включаются в ответ HttpResponse).

Void addCorsHeaders(HttpResponse res) { res.headers.add("Access-Control-Allow-Origin", "*, "); res.headers.add("Access-Control-Allow-Methods", "POST, OPTIONS"); res.headers.add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); }

Первые две строки CORS заголовка разрешают запросы POST и OPTIONS из любых источников. Третий определяет тип запросов POST и OPTIONS сервер разрешает принимать запросы только с определенными заголовками.

Обработка POST запросов

Вот функция, которая обрабатывает клиентские POST запросы.

Void handlePost(HttpRequest req) { HttpResponse res = req.response; print("${req.method}: ${req.uri.path}"); addCorsHeaders(res); req.listen((List buffer) { // Return the data back to the client. res.write("Thanks for the data. This is what I heard you say: "); res.write(new String.fromCharCodes(buffer)); res.close(); }, onError: printError); }

Так же как и запрос OPTIONS, slambookserver получает объект HTTP ответа из запроса, выводит сообщение в консоль и добавляет CORS заголовки к ответу.

Далее в этом коде прослушиваются данные из клиентского запроса POST. Если все данные готовы, вызывается колбэк функция. Эта функция написана в то же месте. Аргументом функции является список чисел, включающий все данные. Каждое число представлено кодом, который может быть представлен в виде символа UTF-16. Но вам не надо беспокоиться об этом, потому что Вы можете просто вызвать метод String.fromCharCodes для конвертации в обычную строку.

Объект HttpResponse управляет потоками данных который сервер может использовать для отправки данных обратно клиенту. Внутри колбэк функции, slambookserver пишет в этот поток сообщения и исходные данные в виде строки. Более сложные серверы будут что-то делать с этими данными, например сохранять их на сервере, обрабатывать, или может даже снимать деньги с вашего счета в банке.

При закрытии потока, объект HttpResponse отправляет данные клиенту.

Пример клиент-серверного приложения slambook может послужить отправной точкой для Вашего собственного клиент-серверного приложения или примером того, как надо строить свои собственные приложения.

Вот образец того что должна выполнять клиентская часть.

    Использовать формы для сбора данных пользователя.

    Помещать поля ввода в ваши формы, для отдельных элементов данных.

    Использовать Polymer для обратной связи, чтобы данные формы были синхронизированы с кодом Dart.

    Отправлять данные напрямую (свойства формы action и method)

    Или программно (переопределяя стандартное поведение кода Dart кнопки отправки)

    Создавать объект ответа на сервере из объекта HttpRequest.

А вот что должен делать сервер.

    Использовать HttpServer для настройки сервера и прослушивания порта.

    Обрабатывать ответы.

    Использовать заголовки CORS чтобы разрешить каждый запрос.

    Ответ на запрос использует HttpResponse.

    Обрабатывать данные асинхронно используя фьючерсы.

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

Эти ресурсы по большей части на основе библиотек Dart, предоставляющих поддержку для написания клиентов и серверов. Учтите что бывает два класса HttpRequest: один в dart:html (для клиентов) и второй dart:io (для серверов).

Ресурс Библиотека Описание
HttpRequest dart:html Клиентская часть HTTP запроса
HttpRequest dart:io Серверная часть HTTP запроса
HttpServer dart:io Серверная часть обрабатывающее HTTP связь с сервером
HttpResponse dart:io Серверная часть которая заботится об отправке ответов на запрос
Streams dart:async Поток данных
Future dart:async Способ получать данные асинхронно
JSON dart:convert Объявление преобразования в JSON по умолчанию
Polymer Polymer Пользовательские элементы, данные связанные с шаблоном

Двухсторонняя привязка данных используя Polymer

Пример slambook использует Polymer для обратной связи, значения элемента ввода с переменными Dart. Если пользователь меняет значение элемента ввода, связанная переменная в коде Dart меняется автоматически. Или если значение меняется в коде Dart, связанный объект пользовательского элемента обновляется автоматически. Статья определение пользовательских элементов предоставит больше деталей о связывании данных и о Polymer.

Этот пример так же использует объявление обработки событий для перехватывания и обработки функций для элементов ввода.

При помощи примера slambook вы можете рассмотреть используется двунаправленное связывание данных для различных элементов ввода, включая новые элементы HTML5. Эта таблица объединяет все двунаправленные атрибуты, которые вы можете использовать с помощью Polymer:

Использование атрибута value в любом элементе ввода

Атрибут value работает в любых элементах ввода и связывает значение со строкой Dart. Этот пример использует value для тактового поля, поля ввода текста, выбора цвета, выбора даты и выбора диапазона.


(Отметим что некоторый код вокруг, например

Словарь в коде Dart названный theData содержит данные формы. Код объекта словаря выделяется при помощи @observable и вызывает toObservable() для связывания.

Словарь содержит пары ключ/значение для каждого элемента ввода, где ключ является строкой. Значения элементов связанных с value являются строками. HTML ссылается на элементы словаря используя их имена (идентификаторы) в Dart. Например значение элемента выбора цвета связано с theData[‘favoriteColor’] .

Использование selectedIndex в выпадающем меню

Элемент