- •Обзор cgi
- •Пример взаимодействия с cgi
- •Пересылка данных формы
- •Кодирование url
- •Дополнительная информация о пути
- •Создание виртуальных документов
- •Пересылка бинарных данных
- •Переменные среды
- •Разбор параметров запроса
- •Поля пароля
- •Поля выбора файла
- •Селекторные кнопки
- •Кнопки передачи
- •Скрытые поля
- •Пример формы
Разбор параметров запроса
Разбор параметров запроса достаточно трудоемкая задача и, обычно, для этой цели используются различные специализированные библиотеки. Для демонстрации принципов анализа параметров, поступающих в 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, можно задать для этого поля начальное стандартное значение.