Приложение 11.
Кодирование и пересылка данных формы

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

    Существуют два метода кодирования информации, содержащейся в форме, которые определяются значением параметра ENCTYPE:

    Схема кодирования application/x-www-form-urlencoded одинакова для обоих методов пересылки (GET и POST) и заключается в следующем.

    Для каждого элемента формы, имеющего имя, заданное параметром NAME, формируется пара NAME=значение. Если значение отсутствует, то соответствующая пара имеет вид NAME=. Все пары объединяются в строку, структура которой описана в приложении 10, в разделе "Обработка информации".

    Закодированная информация пересылается серверу одним из методов GET или POST. Основное отличие заключается в том, как метод передает информацию CGI-программе.

    При использовании метода GET данные формы пересылаются серверу в составе URL-запроса, к которому они добавляются после символа ?. Например, изменив тэг <FORM> HTML-документа следующим образом:

    <FORM ACTION=http://www.domain/cgi-bin/reg.cgi>

при нажатии кнопки ОТПРАВИТЬ мы получим следующий URL-запрос:

    http://www.domain/cgi-bin/reg.cgi?REGNAME=&password1=&password2=&VOZR=lt20&
    LANG=russian&HDN=%CF%F0%E8%E2%E5%F2+%E2%F1%E5%EC%21%21%21&
    But_OK=%CE%D2%CF%D0%C0%C2%C8%D2%DC           .

    Часть запроса, расположенная после символа ?, называется строкой запроса. Web-сервер, присвоит переменной QUERY_STRING значение этой строки и запустит на выполнение программу, имя которой находится до символа ?. CGI-программа reg.cgi сможет затем обратиться к переменной среды QUERY_STRING для обработки закодированных в ней данных.

    Метод GET позволяет передавать данные CGI-программе без использования форм, посредством использования гиперссылок, например:

    <A HREF="http://www.dom/cgi-bin/reg.cgi? REGNAME=bob&AGE=lt20&
    LANGUAGE=russian">Обращение к CGI-программе </A>

    Понятно, что эта информация является статической, а использование форм позволяет менять данные.

    Другим способом передачи данных является дополнительная информация о пути (extra path information). Она представляет собой часть URL-запроса, расположенную после имени CGI-программы. Сервер выделяет ее и сохраняет ее в переменной среды PATH_INFO. CGI-программа может использовать эту переменную для извлечения данных:

    http://www.dom/cgi-bin/reg.cgi/ REGNAME=bob&AGE=lt20&LANGUAGE=russian   .

    Переменная среды PATH_INFO в этом случае будет иметь следующее значение:

    PATH_INFO="/REGNAME=bob&AGE=lt20&LANGUAGE=russian"         .

    Название этой переменной объясняется тем, что обычно таким способом передается информация о мместоположении какого-либо файла. Например, URL:

    http://www.dom/cgi-bin/reg.cgi/texts/jdk_doc.txt

содержит дополнительную информацию:

    PATH_INFO="/ texts/jdk_doc.txt"

о местонахождении файла jdk_doc.txt относительно корневого каталога дерева документов. В приложении 12 перечислены другие переменные среды.

    При использовании метода POST данные формы пересылаются серверу в теле запроса. Среди прочих заголовков, сообщающих серверу информацию о клиенте, имеется заголовок Content-length, сообщающий серверу количество байт, переданных в теле запроса. Это значение сервер присваивает переменной среды CONTENT_LENGTH, а данные посылает в стандартный ввод CGI-программы.