3.3.3 Переменные среды

         В зависимости от метода данные формы передаются в 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>, заменив в этом фрагменте символ “&” его символьным примитивом &#38 или &amp для правильной интерпретации браузером. Правда эта информация является статической, а форма позволяет менять данные.
        Строка запроса не является единственным способом передачи данных через 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 для их реализации.