- •Лабораторная работа № 9 Тема: Применение cgi-скриптов
- •1 Сведения из теории
- •Переменные окружения
- •Механизмы приема данных
- •Interface
- •Implementation
- •InParams,aPasswd : string;
- •Var I, l: integer;
- •Var ss, st : string; k : integer;
- •Var parmstring:String;I:Integer;
- •Пример использования метода get
- •Пример использования метода post
- •I:integer;
- •If Not Eof(Input) then begin
- •2.5 Вывод изображений
- •Var s:TfileStream;
- •I: Integer;
- •VarValue: array [0..200] of Char;
- •If (GetEnvironmentVariable (pChar(ReqVar),
- •2.3 Разработайте cgi-программу гостевой книги.
- •Var I, l: integer;
- •Var buffer:array[0..1024] of char;
- •Var ss, st : string;
- •Var k:Integer;
- •Var n:Integer;
- •Var parmstring:String;I:Integer;
- •3 Содержание отчета
- •Контрольные вопросы
- •Литература
Пример использования метода get
Выше уже было сказано, что переменная среды окружения QUERY_STRING
содержит список имен и значений параметров, переданных из формы. Рассмотрим листинг HTML:
<HTML>
<body >
<form method="GET" action="program.exe">
<input type=text name="toto" value="text">
<input type=submit value="GO">
</form>
</body>
</HTML>
На экране эта форма будет выглядит следующим образом:
Рисунок 14 - Форма ввода представленная выше
При щелчке мыши на кнопке "GO", запускается на сервере программа "program.exe", передавая серверу запрос в виде:
http://www.ваш_сервер/cgi-bin/program.exe?toto=titi
Сразу за именем программы следует знак вопроса и передаваемый в программу параметр. В переменную QUERY_STRING как раз и будет помещено все, что находится после символа "?". Заметим, что точно так же можно задать параметры и в обычной ссылке:
<HTML>
<HEAD>
<TITLE>Передача параметров</TITLE>
<a href="http://www.ваш_сервер/cgi-bin/program.exe?toto=titi">
program.exe </a>
<HEAD>
<HTML>
Если запрос содержит несколько параметров, то они отделяются друг от друга амперсандом &. Кроме того, некоторые символы в значениях параметров (например, "&") должны быть представлены в шестнадцатеричной форме %hh, где "hh" - шестнадцатеричный код символа в таблице ANSI. Например, символ амперсанда "&" должен быть представлен в виде "%26".
Пусть требуется на сайте yahoo.com найти результаты поиска по ключевым словам cgi и delphi, для чего в окне поиска необходимо ввести строку "cgi + delphi".
Тогда в результате запроса будет сгенерирован следующий URL:
http://search.yahoo.com/bin/search?p=cgi+%2B+delphi
Тем самым, произойдет обращение к программе "search" и задано значение параметра "p" равным "cgi + delphi", при этом символ "+" будет автоматически заменен броузером на "%2B" т.е на шестнадцатеричный код сивола "+" , а пробелы - на "+".
Пример использования метода post
Для получения данных, переданных по методу POST, необходимо читать данные из "устройства стандартного ввода", обозначаемое как STDIN. Размер данных, переданных по этому методу, помещается сервером в переменную окружения CONTENT_LENGTH. Это выглядит в Delphi так:
// Получение переданных параметров
if getvar('REQUEST_METHOD')='POST' then begin
parmstring:=getvar('CONTENT_LENGTH');
if parmstring<>'' then begin
size:=strtoint(parmstring);
setlength(parmstring,size);
for i:=1 to size do read(parmstring[i]);
end;
end else
parmstring:=getvar('QUERY_STRING');
Пример CGI-программы, которая просто выводит то, что происходит на сервере:
program log;
{$apptype console}
uses
windows, sysutils;
var
I:integer;
s:string;
p:pchar;
flog:textfile;
begin
assignfile(flog,'c:\temp\log.txt');
rewrite(flog);
WriteLn('Content-Type: text/html');
WriteLn('');
WriteLn('<html><head><title>Dump CGI</title></head><body>');
WriteLn('<h1>Dump CGI:</h1>');
WriteLn('<a href=#Parms>Параметры программы</a><br>');
WriteLn('<a href=#Query>Параметры CGI</a><br>');
WriteLn('<a href=#Env>Переменные окружения</a><br>');
WriteLn('<a href=#Info>Дополнительная информация о CGI</a><br>');
WriteLn('<hr>');
WriteLn('<a name=Parms><h2>ParamCount=',IntToStr(ParamCount),'</h2><ul>');
WriteLn(fLog,'ParamCount=',IntToStr(ParamCount));
for i:=0 to ParamCount do begin
WriteLn('<li>',ParamStr(i));
WriteLn(fLog,'-',ParamStr(i));
end;
// Стандартный Ввод
WriteLn(fLog,'Input :');
WriteLn('<h2>StdInput:</h2><ul>');