В зависимости от метода данные формы передаются в
CGI- программу или через стандартный ввод (POST) или чрез переменную
среды QUERY_STRING (GET). Помимо этих данных CGI- программе доступна
и другая информация, поступившая от клиента в заголовках запроса или
предоставленная веб-сервером. Эта информация сохраняется в
переменных среды.
Тэг <INPUT> является наиболее употребительным тегом, с помощью
которого генерируется внутри формы поля для ввода строки текста,
пароля, имени файла и различных кнопок. Общий вид тэга
<INPUT TYPE=тип_поля_ввода NAME=имя_поля_ввода другие параметры>.
Параметры TYPE и NAME являются обязательными. Параметр TYPE
определяет тип поля: селекторная кнопка, кнопка передачи и т.д.
Параметр NAME определяет имя, присваиваемое полю, которое не
отображается браузером и используется в качестве идентификатора
значения, передаваемого веб-серверу. Остальные параметры меняются в
зависимости от типа поля.
Приведем описание некоторых типов полей, создаваемых при помощи тэга
<INPUT> , и порождаемых ими элементов ввода.
TYPE=TEXT создает элемент для ввода строки текста.
TYPE=FILE создает поле для ввода имени локального файла,
сопровождаемое кнопкой BROWSE. Выбранный файл присоединяется к
содержимому формы при пересылке на сервер. Для корректной передачи
присоединенного файла следует установить значения параметров формы
равными ENCTYPE=”multipart/form-data’
И METHOD=POST, иначе будет передана введенная строка, т.е.
маршрутное имя файла, а не его содержимое.
TYPE=SUBMIT создает кнопку передачи, нажатие которой вызывает
пересылку на сервер всего содержимого формы. Кнопок Submit в форме
может быть несколько.
TYPE=IMAGE создает элемент в виде графического изображения,
действующий аналогично кнопке Submit. Дополнительными параметрами
являются SRC=url_изображения.
TYPE=HIDDEN создает скрытый элемент , не отображаемый пользователю.
Скрытое поле можно использовать для запоминания информации ,
переданной в форме. Дело в том, что сервер не хранит историю диалога
с пользователем и обрабатывает каждый запрос независимо и при
получении следующей формы не будет знать, как она связана с
предыдущей. Чтобы повторно не вводить информацию из первой формы
можно заставить программу перенести необходимые данные в скрытые
поля второй формы. Они не будут видны пользователю, но доступны
серверу. Значение скрытого поля определяется параметром VALUE.
Тэг <SELECT> предназначен для того , чтобы организовать внутри формы
выбор из нескольких вариантов в виде элементов ниспадающего меню или
списка прокрутки.
Тэг <TEXTAREA NAME=имя ROWS= m COLS=n> текст </TEXTAREA> создает
внутри формы поле для ввода многострочного текста, отображаемое в
браузере в виде прямоугольной области с горизонтальной и
вертикальной полосами прокрутки. Для пересылки на сервер каждая
введенная строка дополняется символами %0D%0A (ASCII – символы
возврата каретки и перевода строки), полученные строки объединяются
в одну строку, которая и отправляется на сервер под именем,
задаваемым параметром NAME.
Кодирование данных формы производится одним из двух методов:
стандартным методом application/x-www-form-urlencoded, используемым
по умолчанию или дополнительным методом-multitart/form-data. Второй
метод используется, если к содержимому формы присоединяется
локальный файл, выбранный при помощи элемента формы <INPUT
TYPE=FILE>.Схема кодирования первого способа одинакова для обоих
методов пересылки (GET, POST) и заключается в следующем:
Для каждого элемента формы, имеющего имя, заданное параметром NAME ,
формируется пара “name=value”, где value-значение элемента,
введенное пользователем или назначенное по умолчанию. Если значение
отсутствует, соответствующая пара имеет вид “name=”. Для радиокнопок
и переключателей используются значения только выбранных элементов.
Ели элемент выбран, а значение элемента VALUE не определено, по
умолчанию используется значение “ÖN”.
Все пары объединяются в строку, в качестве разделителя служит символ
“&”. Так как имена и значения представляют обычный текст, то они
могут содержать сиволы, недопустимые в составе URL (метод GET
пересылает данные как часть URL). Такие символы заменяются
последовательностью, состоящей из символов % их шестнадцатеричного ASCII- кода. Символ пробела может заменяться
не только кодом %20, но и знаком +(плюс). Признак конца строки,
встречающийся в поле TEXTAREA, заменяется кодом %0D%0A. Такое
кодирование называется UPL кодированием. Закодированная информация
пересылается серверу одним из методов GET или POST. Основное отличие
заключается в том, как метод передает информацию CGI- программе.
При использовании метода GET данные формы пересылаются серверу в
составе URL- запроса, к которому добавляются после символа “?”. Тело
запроса в этом случае является пустым. Например, при форме вида
<form method=”get” action=”/cgi-bin/name.cgi”>
<input type=”text ” name=”regname”…
запрос будет иметь следующий вид
GET /cgi-bin/name.cgi?regname=bob&… HTTP/1.0
Заголовки запроса, сообщающие серверу информацию о клиенте
<пусто> (тело запроса)
Часть URL после символа “?” называется строкой запроса. Веб-сервер,
получив запрос, присваивает переменной среды QUERY_STRING значение
строки запроса и вызовет CGI программу, обозначенную в первой части
URL до символа “?”:/cgi-bin/name.cgi. CGI- программа сможет затем
обратиться к переменной QYERY_STRING для обработки закодированных в
ней данных.
Метод GET позволяет передавать данные CGI- программе вообще без
использования форм с помощью гиперссылки, помещенной в HTML-
документ в виде
<A HREF=http://имя узла/cgi-bin/name.cgi?regname=bob&...>CGI-программа
</A>, заменив в этом фрагменте символ “&” его символьным примитивом
& или & для правильной интерпретации браузером. Правда эта
информация является статической, а форма позволяет менять данные.
Строка запроса не является единственным способом передачи данных
через URL. Другим способом является дополнительная информация о пути,
представляющая собой часть URL , расположенная после имени CGI-
программы. Сервер выделяет эту часть и сохраняет ее в переменной
среды PATH_INFO. CGI- программа может затем использовать эту
переменную для извлечения данных. Например, URL
http://www.domain/cgi-bin/name.cgi/regname=bob&...
Содержит данные в виде дополнительной информации о пути. При
получении запроса с таким URL сервер сохранит данные в переменной
среды
PATH_INFO= “regname=bob&…”
При использовании метода POST данные формы пересылаются серверу в
теле запроса. При форме вида
Form method=”post” action=”/cgi-bin/name.cgi”>
Запрос клиента будет иметь следующий вид
POST /cgi-bin/name.cgi HTTP/1.1
( заголовок запроса , сообщающий серверу информацию о клиенте)
Content-length: 126
Regname=bob&….
Заголовок Content-length сообщает серверу количество байт,
передаваемых в теле запроса. Это значение сервер присваивает
переменной среды CONTENT_LENGTH, а данные посылает в стандартный
ввод CGI-программе.
Познакомившись с теоретическими представлениями об организации
cgi-приложений, теперь посмотрим, как можно использовать C++Builder
для их реализации.