Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Сервер Web своими руками. Язык HTML, приложения CGI и ISAPI, установка серверов Web для Windows

© Александр Фролов, Григорий Фролов
Том 29, М.: Диалог-МИФИ, 1997, 288 стр.

[Назад] [Содеожание] [Дальше]

Передача данных программе CGI

Когда пользователь заполняет форму и нажимает на кнопку типа SUBMIT либо на графическую кнопку (которая выполняет аналогичную функцию), данные из полей формы вместе с именами этих полей передаются навигатором серверу WWW. Сервер, в свою очередь, анализирует эти данные и запускает соответствующую программу CGI, путь к файлу которой указан в операторе <FORM>.

Перед запуском программы CGI сервер WWW выбирает в зависимости от значения параметра METHOD оператора <FORM> один из двух способов передачи полученных данных для обработки. Это методы GET и POST.

Метод GET

Метод GET предполагает передачу данных программе CGI через переменные среды (environment variables). Это те самые переменные среды, которые устанавливаются в операционной системе MS-DOS командой SET.

Сервер WWW создает для программы CGI довольно много переменных среды. Имена и назначение всех этих переменных вы узнаете позже, а пока мы расскажем только о самых необходимых.

Прежде всего, метод GET предполагает использование переменной среды с именем QUERY_STRING. Именно сюда попадают данные из полей формы. Эти данные находятся в следующем формате:


"Имя1=Значение1&Имя2=Значение2&Имя3=Значение3"

Здесь в качестве имен используются значения параметров NAME, задающих имена полей формы. Вместо значений подставляются данные из соответствующих полей. Сканируя содержимое текстовой строки переменной среды QUERY_STRING, программа CGI может найти в ней имя любого нужного поля и соответствующее этому имени значение. Заметим, что никакие данные от выключенных переключателей не передаются, поэтому не следует думать, что в полученной строке вы обязательно встретите имена всех полей, расположенных в форме.

Адрес заданной строки переменной среды в программе, составленной на C, легко получить с помощью функции getenv:


char * szQueryString;
szQueryString = getenv("QUERY_STRING");

Заметим, что если вы собираетесь модифицировать строку переменной среды, то ее следует скопировать во внутренний буфер. Операционная система сервера WWW может не допустить прямого редактирования блока памяти, содержащего переменные среды.

Строка, передаваемая в переменной среды QUERY_STRING, закодирована с использованием так называемой кодировки URL. В этой кодировке все символы пробелов заменяются на символы “+”. Кроме того, для представления кодов управляющих и некоторых других символов используется последовательность символов вида “%xx”, где символы “xx” представляют собой шестнадцатеричный код символа в виде двух символов ASCII. В нашей книге вы найдете исходные тексты функций, предназначенные для перекодирования информации, полученной из формы.

Метод POST

При использовании метода POST программа CGI получает данные из формы через стандартный поток ввода STDIN. Если программа CGI составлена на языке программирования C, то для получения данных она может воспользоваться такими функциями, как fread или scanf.

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

Ниже мы привели фрагмент кода для определения размера информации для ввода через стандартный поток STDIN:


int Size;
Size = atoi(getenv("CONTENT_LENGTH"));

Входные данные могут быть затем получены, например, следующим образом:


char szBuf[8196];
fread(szBuf, Size, 1, stdin);

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

Если в операторе <FORM> не указан параметр ENCTYPE (тип MIME передаваемых данных) или этот параметр имеет значение application/x-www-form-urlencoded, данные, полученные через стандартный поток ввода, закодированы в кодировке URL. Перед использованием вы должны их раскодировать соответствующим образом.

Что лучше - GET или POST

Метод GET обычно используется для обработки небольших форм, так как навигаторы накладывают ограничения для размера данных, передаваемых через переменную среды QUERY_STRING.

В этом отношении метод POST является более предпочтительным, так как не накладывает на размер передаваемых данных никаких ограничений. Только метод POST пригоден для передачи файлов из локального компьютера через навигатор в сервер WWW.

[Назад] [Содеожание] [Дальше]