Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЗ_4_Применение CGI-скриптов.doc
Скачиваний:
11
Добавлен:
20.08.2019
Размер:
6.8 Mб
Скачать

Механизмы приема данных

Обмен данными в WWW подразделяется в соответствии с типами методов доступа протокола HTTP и видами запросов в спецификации CGI.

Для полноценной работы CGI-приложения оно должно уметь не только выводить некие данные, но и получать данные от пользователя, то есть обеспечивать ввод информации. Ввод данных в случае CGI-приложения будет осуществляться по средствам интерфейса организованного Web-формой. Такая форма может передавать данные двумя описанными выше способами, в зависимости от значения атрибута “METHOD”.

Метод POST используется в тех случаях, когда необходимо передать большое количество параметров или большой объем данных. При использовании же метода GET для хранения всех передаваемых параметров используется переменная среды окружения и ее максимального размера в некоторых случаях может не хватить.

В запросах по методу GET данные от клиента передаются CGI-программе в переменной окружения QUERY_STRING. В запросах по методу POST данные от формы пользователя передаются в потоке стандартного ввода CGI-программе. При передаче через поток стандартного ввода в переменной окружения CONTENT_LENGHT указывается число передаваемых символов.

Запрос типа form-urlencoded — это запрос вида:

http://intuit.ru/somthig-cgi/cgi-script?field=word1&field2=word2

Данные формы записываются в виде пар "имя_поля-значение", которые разделены символом "&" (т.е в формате URLencoded). Все символы после символа "?" попадут в переменную окружения QUERY_STRING. При этом если в значениях полей появляется кириллица или специальные символы, то они заменяются шестнадцатеричным кодом символа, который следует за символом "%".

Приведенный синтаксис обращения, используется при обращение к CGI-приложению по методу GET.

<FORM METHOD=”GET” …>

При обращении к CGI-приложению по методу POST:

<FORM METHOD=”POST” …>

Данные после символа "?" не будут размещаться в QUERY_STRING, а будут направлены в поток стандартного ввода CGI-приложения. В этом случае количество символов в потоке стандартного ввода CGI-приложению будет указано в переменной окружения CONTENT_LENGTH.

При запросе типа multipart/form-data применяется составное тело HTTP-сообщения, которое представляет собой данные, введенные в форме, и данные присоединенного внешнего файла. Это тело помещается в поток стандартного ввода CGI-программы. При этом к данным формы применяется кодирование как в form-urlencoded, а данные внешнего файла передаются как есть.

Таким образом, задача получения данных CGI-приложением сводится к чтению определенной переменной окружения.

Чтобы определить, каким именно методом CGI-программе переданы параметры, достаточно в CGI-программе проверить переменную среды REQUEST_METHOD.

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

function getvar(varname:string):string;

var

buffer:array[0..1024] of char;

size:integer;

begin

size:=GetEnvironmentVariable(PChar(varname),buffer,sizeof(buffer));

if size=0 then getvar:='' else getvar:=String(buffer);

end;

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

Таким образом, если обратиться к функции в виде GetVar ('REQUEST_METHOD'), то результатом будет строка с методом, которым были переданы параметры то есть: 'GET' или 'POST'.

Согласно спецификации CGI, параметры могут быть прочитаны:

а) из переменной окружения QUERY_STRING для метода GET;

б) из стандартного ввода (STDIN) с помощью процедуры ReadLn для метода POST.

Задача программиста сводится к извлечению значений нужных атрибутов из полученной от броузера строки и преобразования этих значений из вида URLencoded в обычные текстовые данные. Суть URLencoded формата заключается в том, что некоторые символы, содержащиеся в значении поля, заменяются на % и следующим за ним шестнадцатеричным кодом символа, а пробел заменяется на +.

Запросы оператора FORM обрабатываются таким образом, что каждый параметр, отвечающий за имя поля, оканчивается знаком равенства, а остаток представляет собой значение этого параметра. Если присутствует что-либо после имени CGI-программы (шлюза), то эта информация передается в качестве первого параметра. Иначе первый параметр будет пуст.

Например:

/htbin/foo/x/y/z?name1=value1&name2=value2

вызывается как:

/.../foo /x/y/z name1= value1 name2= value2

а

/htbin/foo?name1=value1&name2=value2

вызывается как:

/.../foo '' name1= value1 name2= value2

Рассмотрим примеры формы и CGI приложения, которое бы производило идентификацию пользователя системы.

<!—HTML форма ввода пароля -->

<HTML> <HEAD>

<TITLE>Авторизация доступа</TITLE>

</HEAD> <BODY>

<FORM method=”POST” action=”http://localhost/cgi-bin/chkpaswd.exe”>

Введите пароль:

<input type=”password” name=”paswd” size=20>

<input type=”submit” value=”Найти”>

<input type=”reset” value=”Очистить”>

</FORM>

</BODY>

</HTML>

Так это будет выглядеть в броузере:

Рисунок 11 – Пример формы авторизации пользователя

Пример текста программы для обработки формы идентификации пользователя:

PROGRAM chkpaswd;

{$APPTYPE CONSOLE}

uses

MainUn in 'MAinUn.pas'

begin

Main;

end.

UNIT MainUn;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]