Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / !!! ИТ Архив / Лекции / 5_C G I / Лекция 2 - Обзор CGI.doc
Скачиваний:
28
Добавлен:
04.04.2013
Размер:
169.47 Кб
Скачать

Разбор параметров запроса

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

uses Dos;

function p_value ( query_str : string; p_name : string ) : string;

var

dev_pos : byte;

pair_str : string;

begin

p_value := '';

while length( query_str ) > 0 do

begin

dev_pos := pos( '&', query_str );

if dev_pos > 0 then

begin

pair_str := copy( query_str, 1, dev_pos - 1 );

delete( query_str, 1, dev_pos);

end

else

begin

pair_str := query_str;

query_str := '';

end;

dev_pos := Pos( '=', pair_str );

if copy( pair_str, 1, dev_pos - 1 ) = p_name then

begin

p_value:=copy( pair_str, dev_pos + 1, length( pair_str ) - dev_pos );

query_str := '';

end;

end;

end;

begin

writeln('Content-Type: text/html');

writeln;

writeln('<html><body>');

writeln(

'Hello "' +

p_value( GetEnv('QUERY_STRING'), 'fname' ) +

' ' +

p_value( GetEnv('QUERY_STRING'), 'lname' )

);

writeln('</body></html>');

end.

Основа примера – функция p_value. Она принимает два параметра: строку запроса и имя параметра, значение которого нам необходимо выделить. Фактически, задача сводится к поиску в строке запроса пар имя=значение, где имя совпадает с именем затребованной переменной. В случае отсутствия в запросе необходимого параметра возвращается пустая строка, а в случае наличия двух параметров с одинаковым именем – тот, который идет в запросе первым. Сразу заметим, что для простоты не производится обратного декодирования значений из закодированного вида, т.е. все не латинские символы будут URL-закодированными, вида %XX.

Методом запроса, предполагается GET, поэтому параметры запроса мы может получить из переменной среды QUERY_STRING. Для получения переменной среды используется функция GetEnv() из модуля Dos. Единственный параметр указанной функции – имя переменной среды, которое необходимо получить.

В идеале, получать строку запроса из QUERY_STRING необходимо только в том случае, если использован метод GET. Для этого необходимо проверить значение переменной среды REQUEST_METHOD на равенство ‘GET’. В случае, если использован метод POST, т.е. REQUEST_METHOD равно ‘POST’, строку запроса необходимо читать из входного потока. Эта модификацию примера читатель может проделать самостоятельно.

Теги форм HTML

HTML-формы, предназначенные для ввода информации пользователем, широко используются во многих CGI-программах. Здесь рассматриваются теги, с помощью которых создаются формы, и приводится пример их применения.

Сводка тегов форм

Форма включает одно или несколько полей для ввода текста, селекторные кнопки, опции, ниспадающие меню и чувствительные к щелчку мыши изображения. Форма задается с помощью тега <form>. Кроме этих, она может содержать и другие элементы, такие как текст и изображения.

Тег <form>

Задавать форму можно в любом месте HTML-документа. Ее элементы помещаются между начальным тегом <form> и соответствующим конечным тегом </form>. Теги и атрибуты, заключенные между тегами <form>, образуют одну форму. Когда пользователь передает форму серверу, браузер посылает на сервер все значения этих элементов: и пустые, и стандартные, и измененные пользователем.

Обязательным атрибутом action тега <form> задается URL прикладной программы, которая предназначена для приема и обработки введенных в форму данных. Типичный тег <form> с атрибутом action выглядит следующим образом:

<form action="http://www.ora.com/cgi-bin/update">

</form>

В соответствии с заданным в примере универсальным локатором ресурса браузер должен установить контакт с сервером www.ora.com и передать введенные пользователем в форму значения прикладной программе с именем update, которая находится в каталоге cgi-bin.

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

Стандартный формат кодирования — это MIME-тип application/x-www-form-urlencoded. С помощью необязательного атрибута enctype в теге <form> можно указать и другой формат. Но если вы захотите это сделать, следует учитывать, что существует только один дополнительный поддерживаемый формат — multipart/form-data.

При использовании стандартного формата кодирования — application/x-www-form-urlencoded — пробелы, содержащиеся в данных формы, преобразуются в знаки "+"; каждый символ, не относящийся к числу буквенно-цифровых, — в последовательность, которая состоит из знака процентов и двух шестнадцатеричных цифр, представляющих собой ASClI-код символа, а знаки переноса строк в многострочных данных — в %0D%0A.

При применении формата кодирования multipart/form-data каждое поле формы преобразуется в один из фрагментов MIME-совместимого составного документа.

Другой обязательный атрибут тега <form> — method задает метод, который браузер использует для передачи данных формы на сервер с целью их последующей обработки. Существует два метода: POST и GET.

Тег <input>

Тег <input> служит для определения одного из стандартных элементов ввода формы. Это может быть текстовое поле, селекторная кнопка, опция, чувствительное к щелчку мыши изображение или кнопка передачи. У этого тега есть много атрибутов, но обязательными для каждого элемента являются атрибуты type и name (для кнопки передачи — только type). Для каждого типа элемента ввода используется только подмножество допустимых атрибутов. В зависимости от типа элемента формы возможно применение дополнительных атрибутов этого тега.

Обязательный атрибут type тега <input> служит для задания типа элемента, включаемого в форму. Атрибут name служит для присвоения имени полю. Это имя используется в процессе передачи формы на сервер.

Наиболее полезным (и самым распространенным) является элемент ввода формы поле ввода текста. В окне браузера поле ввода текста отображается как пустое поле, в котором помещается одна строка данных. Поле ввода текста обеспечивает возможность ввода строки данных, которая при передаче формы на сервер интерпретируется как значение соответствующего элемента. Для создания поля ввода текста в форме, включенной в HTML-документ, необходимо с помощью тега <input> установить тип элемента формы text. Следует включить и атрибут name.

С помощью атрибутов size и maxlength задается ширина (в знаках) поля отображения вводимого текста и максимальное количество символов, которые пользователь может ввести в данное поле. Для атрибута maxlength используемое по умолчанию значение не ограничено, а для size — зависит от браузера.

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