Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабы / ИТСлаб8.doc
Скачиваний:
25
Добавлен:
16.04.2013
Размер:
390.66 Кб
Скачать

5.3. Разработка cgi-приложения, анализирующего данные, введенные пользователем с помощью элементов управления

Пользователь осуществляет подготовку данных для web-приложения средствами интерфейса, реализованного с помощью элементов управления, находящихся в форме ввода. Щелчок на кнопке SUBMIT, расположенной на форме, инициирует запуск web-сервером web-приложения, указанного атрибутом ACTION в теге <FORM>. Перед запуском web-приложения web-сервер формирует строку параметров. Содержимое этой строки зависит от элементов управления, расположенных в форме ввода.

Каждый из этих элементов имеет идентификатор, задаваемый атрибутом NAME, и значение, определяемое атрибутом VALUE или последовательностью символов, введенных пользователем. Из идентификаторов элементов управления и их значений формируется строка параметров следующего вида:

идентификатор1=значение1&идентификатор2=значение2…

Каждый параметр этой строки соответствует одному элементу управления и представляет собой имя элемента и его значение, разделенные знаком равенства. Различные параметры, относящиеся к разным элементам управления, разделяются в строке символами &. Если символы = или & входят в состав имени или значения элемента управления, то они кодируются последовательностью из трех знаков: первый знак - %, за ним следуют две 16-ичные цифры, являющиеся кодом символа. Кроме этих двух символов, трехзначными последовательностями обычно кодируются все символы, за иключением латинских букв, цифр и символа пробела. Символ пробела заменяется символом +. Полученная строка параметров должна быть декодирована web-приложением после ее поступления от web-сервера.

Строка параметров может передаваться методом GET или методом POST, название которых указывается значением атрибута METHOD в теге <FORM>: при использовании метода GET строка параметров передается вместе с URL вызываемого CGI-приложения, а для разделения URL и строки параметров используется символ ?; в случае применения метода POST строка параметров передается в теле HTTP-запроса.

При разработке CGI-приложения важно знать не только метод передачи строки параметров, но и технологию ее получения в CGI-приложении. В зависимости от метода передачи различаются и методы получения строки параметров:

- при использовании метода GET строка параметров передается CGI-приложению через переменную окружения QUERY_STRING;

- при использовании метода POST строка параметров передается CGI-приложению через стандартный поток ввода консольного приложения. Длина строки в этом случае определяется через переменную окружения CONTENT_LENGTH.

Считывание строки параметров при использовании метода GET реализуется функцией, возвращающей значение переменной окружения с заданным именем. Для этого можно использовать следующую API-функцию:

AnsiString__fastcall GetEnvironmentVariable(const AnsiString Name);

Здесь Name - имя переменной окружения.

Считывание строки параметров при использовании метода POST происходит из стандартного потока ввода консольного приложения. При этом следует считывать именно такое число символов, какое содержится в передаваемой строке. Попытка прочитать больше символов, чем есть, приведет к "зависанию" приложения. Если же считать не все символы, то часть информации будет потеряна. Для чтения данных из стандартного потока ввода можно использовать стандартную процедуру scanf языка С. Количество символов, подлежащих чтению, передается через переменную окружения CONTENT_LENGTH, значение которой определяется с помощью функции GetEnvironmentVariable.

Перед получение строки параметров обычно проверяется, какой метод передачи информации использован. Знание метода обеспечит правильность считывания передаваемой информации в любом случае. Название метода содержится в переменной окружения REQUEST_METHOD, значение которой определяется с помощью функции GetEnvironmentVariable.

Программный код CGI-приложения GetPostTest, позволяющего проверить используемый метод передачи информации и проконтролировать данные, набранные пользователем в полях ввода и переданные на WWW-сервер, приведен ниже. Приложение GetPostTest возвращает пользователю HTML-документ, в котором содержится сформированная web-сервером строка параметров, принятая этим приложением:

/* program GetPostTest */

#include <Windows.hpp>

int ContentLength, i;

char St1[50], //Название метода

St2[200]; //Строка параметров

char c;

void main(void)

{

// Получаем название метода

GetEnvironmentVariable("REQUEST_METHOD",St1,50);

// Устанавливаем для символов верхний регистр

i = strlen(St1);

while (i>0)

{

St1[i-1] = UpCase(St1[i-1]);

i--;

}

// Анализируем метод передачи данных

if (strcmp(St1,"GET") == 0)

{

// Получаем строку параметров

GetEnvironmentVariable("QUERY_STRING",St2,200);

}

if (strcmp(St1,"POST") == 0)

{

// Получаем длину строки параметров

GetEnvironmentVariable("CONTENT_LENGTH",St2,50);

// Преобразуем строку в число

ContentLength = atoi(St2);

// Считываем символы из стандартного потока ввода

for (i=0; i<ContentLength; i++)

{

scanf("%c",C);

St2[i] = C; St2[i+1] = 0;

}

}

// Формируем поле заголовка Content-Type

puts("Content-Type: text/html");

// Формируем пустую строку,отделяющую

// заголовок от тела ответа

puts("");

// Построчно формируем HTML-документ

puts("<HTML>");

puts("<HEAD>");

puts("<TITLE>Пример №3. Передача и прием данных</TITLE>");

puts("</HEAD>");

puts("<BODY>");

puts("<H2 ALIGN=CENTER>CGI-приложение принимает параметры</H2>");

printf("<H2 ALIGN=CENTER>Method %s</H2>\n", St1);

printf("<H2 ALIGN=CENTER>Строка параметров: %s</H2>\n", St2);

puts("</BODY>");

puts("</HTML>");

}

Откомпилируем приложение и скопируем файл GetPostTest.cgi на устройство W.

Для проверки работоспособности приведенного приложения воспользуемся HTML-документом JStest.html и дополним его описанием еще одной формы c двумя элементами управления - полем ввода и кнопкой, расположив описание этой формы перед тегом </BODY>:

<FORM NAME= "testGET" METHOD="GET" ACTION="./GetPostTest.cgi">

<P>

Данные для передачи методом GET:

<INPUT TYPE="submit" VALUE="ПОСЛАТЬ(GET)" >

<INPUT TYPE="text" NAME="data" VALUE="Оставьте этот текст">

Кроме этого дополнения, исправим в форме info значение атрибута ACTION на "./GetPostTest.cgi", а значение атрибута VALUE для кнопки "submit" изменим на "ПОСЛАТЬ(POST)". Полученный таким образом HTML-документ сохраним в файле GetPostTest.html и скопируем его на устройство W.

Для проверки разработанного CGI-приложения в браузере укажите адрес скопированного HTML-документа: http://webapp/<регистрационное_имя>/GetPostTest.html

Заполните поля ввода, отправьте данные на сервер и проанализируйте ответы сервера, полученные с участием CGI-приложения.

5.4. Разработка CGI-приложения с использованием компонента Borland C++ Builder WebModule

В системе Borland C++ Builder имеются специальные средства, позволяющие значительно упростить разработку web-приложений. Основой этих приложений является компонент TWebModule, с помощью которого приложение выполняет интерпретацию HTTP-запросов.

Основное свойство компонента TWebModule - свойство Actions, которое содержит список действий, являющихся обработчиками запросов, поступающих от клиента.

Каждый элемент этого списка имеет тип TWebActionItem и может обрабатывать всего одно событие - OnAction. Именно процедура обработки этого события выполняет формирование ответа сервера на принятый запрос клиента, анализируя значение параметра Request, представляющего запрос, и формируя значение параметра Response, представляющего ответ.

Параметр Request (запрос) имеет следующие основные свойства:

1) Content - строка параметров, переданная клиентом с помощью метода POST;

2) ContentFields - "разобранная" строка параметров, переданная с помощью метода POST. Каждый элемент этой коллекции представляет собой строку, соответствующую одному элементу управления, расположенному на форме, и содержащую имя элемента управления и его значение, разделенные знаком равенства (идентификатор=значение);

3) Query - строка параметров, переданная клиентом с помощью метода GET;

4) QueryFields - "разобранная" строка параметров, переданная с помощью метода GET. Формат строк этой коллекции полностью аналогичен формату строк коллекции ContentFields;

5) RemoteAddr - строка с IP-адресом клиента, пославшего запрос;

6) RemoteHost - строка с доменным именем клиента, пославшего запрос;

7) Method - строка с названием метода, используемого для передачи данных серверу.

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

Параметр Response (ответ) имеет следующие основные свойства:

1) ContentType - строка, обозначающая тип данных, содержащихся в теле ответа;

2) ContentLength - число символов, содержащихся в теле ответа;

3) Content - строка с содержимым тела ответа;

4) ContentStream - определяет объект, который будет передан клиенту. Данное свойство обычно используется для передачи клиенту двоичных файлов. Если свойство ContentStream, то оно заменяет свойство Content.

Создадим в Borland C++ Builder с использованием средств, предоставляемых компонентом TWebModule, CGI-приложение, которое будет обрабатывать данные, введенные пользователем в формах HTML-документа GetPostTest.html.

1. Выберите в главном меню Borland C++ Builder команду File | New, а в открывшемся окне на закладке New двойным щелчком мыши выберите значок Web Server Application, чтобы создать консольное приложение.

2. В открывшемся диалоговом окне с помощью радиокнопки выберите тип web-приложения CGI Stand-alone executable и щелкните по кнопке ОК, чтобы создать новое CGI-приложение, содержащее компонент TWebModule.

При использовании компонента TWebModule обязательно надо задать хотя бы одно действие, которое будет выполнять обработку запроса клиента. Для задания действия надо:

1) в инспекторе объектов выбрать компонент TWebModule и щелкнуть на кнопке с многоточием в поле свойства Actions этого компонента. При этом откроется окно редактора действий;

2) в окне редактора действий щелкнуть на кнопкеAdd New, чтобы создать новое действие;

3) задать обработчик запроса, т.е. обработчик события OnAction созданного действия. Для этого нужно в инспекторе объектов выбрать закладку Events и дважды щелкнуть в поле этого события, чтобы создать шаблон процедуры обработки события OnAction.

В шаблон процедуры поместим операторы для формирования ответа сервера, в который включаются название используемого метода передачи данных и содержимое полей ввода с идентификаторами (именами) address из формы info и data из формы testGET:

void __fastcall TWebModule1::WebModule1WebActionItem1Action(

TObject *Sender, TWebRequest *Request, TWebResponse *Response,

bool &Handled)

{

AnsiString FieldValue;

if (Request->Method == "GET")

{

FieldValue = Request->QueryFields->Values["data"];

Response->Content = "<H2> Методом GET передана строка ";

Response->Content += FieldValue;

Response->Content += " в поле data </H2>";

}

if (Request->Method == "POST")

{

FieldValue = Request->ContentFields->Values["address"];

Response->Content = "<H2> Методом POST передана строка ";

Response->Content += FieldValue;

Response->Content += " в поле address </H2>";

}

}

Откомпилируйте приложение под именем WebModProject и скопируйте его исполняемый модуль на устройство W. В HTML-документе GetPostTest.html измените имя CGI-приложения на WebModProject и сохраните измененный HTML-документ под именем WebModProject.html, скопируйте его на устройство W и вызовите из браузера для проверки работоспособности CGI-приложения.

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в папке лабы