На этом шаге мы рассмотрим особенности передачи информации на сервер.
Как мы уже знаем, существуют два метода кодирования информации, содержащейся в форме:
Схема кодирования application/x-www-form-urlencoded одинакова для обоих методов пересылки GET и POST и заключается в следующем.
Для каждого элемента формы, имеющего имя, заданное атрибутом NAME, формируется пара "name=value", где value - значение элемента, введенное пользователем или назначенное по умолчанию. Если значение отсутствует, соответствующая пара имеет вид "name=". Для радиокнопок и переключателей используются значения только выбранных элементов. Если элемент выбран, а значение атрибута VALUE не определено, по умолчанию используется значение "ON".
Все пары объединяются в строку, в качестве разделителя служит символ &. Так как имена и значения представляют собой обычный текст, то они могут содержать символы, недопустимые в составе URL (метод GET пересылает данные как часть URL). Такие символы заменяются последовательностью, состоящей из символа % и их шестнадцатеричного ASCII-кода. Символ пробела может заменяться не только кодом %20, но и знаком + (плюс). Признак конца строки, встречающийся в поле TEXTAREA, заменяется кодом %0D%0A. Такое кодирование называется URL-кодированием.
Закодированная информация пересылается серверу одним из методов GET или POST. Основное отличие заключается в том, как метод передает информацию CGI-программе.
При использовании метода GET данные формы пересылаются серверу в составе URL-запроса, к которому добавляются после символа ? (вспомним, что запрос - это формализованный способ обращения браузера к Web-серверу). Тело запроса в этом случае является пустым. Для формы из примера предыдущего шага запрос выглядит следующим образом:
GET /cgi-bin/registrar.cgi? regname=bob&passwordl= rumata&password2=rumata& age=lt20&language=russian&format= HTML&wish=%F6%C5%CC%Dl%DA%CE%D9 HTTP/1.0 ' ' (заголовки запроса, сообщающие серверу информацию о клиенте) ' <пусто> (тело запроса)
Часть URL после символа "?" называется строкой запроса. Web-сервер, получив запрос, присвоит переменной среды QUERY_STRING значение строки запроса и вызовет CGI-программу, обозначенную в первой части URL до символа "?":
/cgi-bin/registrar.cgi
<А HREF="http://www.domain/cgi-bin/registrar.cgi?regname= bob& password1=rumata&password2=rumata&age=lt20&language=russian& format=HTML&wish=%F6%C5%CC%Dl%DA%CE%D9">CGI-программа</А>,
К сожалению, эта информация является статической. Форма же позволяет менять данные.
Строка запроса - не единственный способ передачи данных через URL. Другим способом является дополнительная информация о пути (extra path information), представляющая собой часть URL, расположенную после имени CGI-программы. Сервер выделяет эту часть и сохраняет ее в переменной среды PATH_INFO. CGI-программа может затем использовать эту переменную для извлечения данных. Например, URL
http://www.domain/cgi-bin/registrar.cgi/ regname=bob&password1=rumata&password2=rumata&age=lt20&language= russian&format=HTML&wish=%F6%C5%CC%Dl%DA%CE%D9
PATH_INFO= "/regname=bob&password1=rumata&password2=rumata& age= lt20&language=russian&format=HTML&wish=%F6%C5%CC%Dl%DA%CE%D9"
http://www.domain/cgi-bin/registrar.cgi/texts/jdk_doc.txt
PATH_TRANSLATED="/home/httpd/docs/texts/jdk_doc. txt"
При использовании метода POST данные формы пересылаются серверу в теле запроса. Если в примере предыдущего шага вместо метода GET использовать метод POST
<form method="post" action="/cgi-bin/registrar.cgi">,
POST /cgi-bin/registrar.cgi HTTP/1.1 ' ' (заголовки запроса, сообщающие серверу информацию о клиенте) ' Content-length: 126 regname=bob&password1=rumata&password2=rumata&age=lt20& language=russian&format=HTML&wish=%F6%C5%CC%Dl%DA%CE%D9
В этом фрагменте среди прочих заголовков выделен заголовок Content-length, сообщающий серверу количество байт, переданных в теле запроса. Это значение сервер присваивает переменной среды CONTENT_LENGTH, а данные посылает в стандартный ввод CGI-программы.
Методы GET и POST имеют свои достоинства и недостатки. Метод GET обеспечивает лучшую производительность при пересылке форм, состоящих из небольшого набора коротких полей. При пересылке большого объема данных следует использовать метод POST, так как браузер или сервер могут накладывать ограничения на размер данных, передаваемых в составе URL, и отбрасывать часть данных, выходящую за границу. Метод POST, к тому же, является более надежным при пересылке конфиденциальной информации.
На следующем шаге мы рассмотрим CGI-сценарии.