Вход


Главная страница >> Учебный процесс >> Конспекты >> Delphi. Delphi Book - сборник разных FAQ'ов >> Написание CGI скриптов (продолжение). >> Написание CGI скриптов на Delphi.

[Назад]    [Содержание ]    [Вперед]

  


Написание CGI скриптов на Delphi.


Написание CGI скриптов на Delphi

    Итак Вам надоели статические страницы на Вашем сайте и Вы решили написать свой первый скрипт. На первый план выходит проблема выбора подходящих инструментов для этого действия. В этой статье мы остановимся на Inprise Delphi. На самом деле, все написанное здесь с легкостью переносится на любой (или почти любой) язык или платформу.

    Кое-кто может мне возразить, что описанный в статье способ создания CGI скриптов не самый удобный из тех что предоставляет Delphi, что можно просто создать Web Server Application. Но в описаным способом создаются гиганские приложения размером около 400 килобайт, а выгода от простоты написания черезвучайно иллюзорны.

    1. Необходимые приспособления

   Для отладки CGI скриптов нам нужен www сервер, поддерживающий CGI скрипты. Например Personal Web Server от Microsoft или Apache Web Server. Если у Вас на компьютере на установлен ни один из подходящих серверов, а Вам не хочется захломлять свой компьютер огромными программами, то можно воспользоваться крохотным www сервером TinyWeb. Эта программа вполне удовлетворяет требованиям к www серверу, необходимому для отладки CGI приложений. Найти ее можно например на ftp://ftp.imc.da.ru/pub/developer/TinyWeb.zip или на сайте производителя: http://www.ritlabs.com/tinyweb

    Установка сервера предельно проста: нужно разорхивировать все файлы из архива в какую-либо директорию и запустить модуль TinyWeb.exe, указав в качестве параметра коммандной строки полный путь к корневому каталогу сервера. Нужно помнить, что в этом каталоге должен распологаться файл с именем index.html. Надо так же создать подкаталог с именем CGI-BIN в который мы будем помещать скомпилированные CGI скрипты.

    2. Статический CGI скрипт

    В случае Windows CGI скрипт представляет собой обычное консольное Win32 приложение. Для создания такого приложения в Delphi проще всего воспользоваться следующим шаблоном:

// ******************************
// файл: CGI.dpr
// ******************************
program CGI;{$APPTYPE CONSOLE}
uses
Windows,
CGIUN in 'CGIUN.pas';
begin
Main;
end.// ******************************
// файл: CGIUN.pas
// ******************************
unit CGIUN;
interface
procedure Main;
implementation
procedure Main;
begin
end;
end.

    Запишем эти файлы в какую-либо папку и откроем проект CGI.dpr в Delphi. В модуле CGIUN в процедуре Main напишем:

procedure Main;
begin
WriteLn('Content-Type: text/html');
WriteLn;
WriteLn('<html>');
WriteLn('<head>');
WriteLn('<title>CGI скрипт</title>');
WriteLn('</head>');
WriteLn('<body>');
WriteLn;
WriteLn('<h1>Пример HTML страницы сгенерированной CGI скриптом</h1>');
WriteLn('</body>');
WriteLn('</html>');
end;

    Откомпилируем проект и поместим выполняемый модуль в директорию для скриптов (обычно это CGI-BIN или SCRIPTS) www сервера. Затем запустим   браузер и наберем путь до нашего примера. Насладимся результатом:

    Таким образом написан простой CGI скрипт, выдающий статическую html страницу. Заметим, к слову, что получившийся выполняемый модуль имеет размер всего 17 килобайт, что совсем не характерно для программ, написанных на Delphi.

    3. Динамический CGI скрипт

    Теперь мы можем переходить к более сложным случаям. В этой главе мы напишем CGI скрипт, при помощи которого можно наладить взаимодействие с клиентом.  Пусть нам нужно запросить имя пользователя и его пароль и на основании введенного значения показать в браузере надпись "доступ разрешен"  если имя пользователя "user1", а пароль "password", или "ошибка авторизации" в противном случае. Для начала нужно создать html документ, содержащий форму для нашего скрипта. Как Вы может быть знаете, что данные формы могут быть переданы от клиента на сервер двумя методами: методом Get и методом Post. В этой главе мы рассмотрим оба метода.

    3.1 Передача параметров методом Get

    В нашем случае, для метода Get html документ будет иметь вид:

<HTML>
<HEAD>
<TITLE>Log in</TITLE>
</HEAD>
<BODY>
<H1>CGI Testing Example</H2>
<HR>
<H3>Log in</H3>
<FORM ACTION="/cgi-bin/cgi.exe" METHOD="get">
UserId<BR>
<INPUT TYPE=text NAME="USERID"><BR>
Password<BR>
<INPUT TYPE=text NAME="PASSWORD">
<P>
<INPUT TYPE=submit VALUE="Log in"><INPUT TYPE=RESET VALUE="Clear">
</FORM>
<HR>
</BODY>
</HTML>

    Запишем этот текст в файл login.htm и поместим в корневую директорию www сервера. Теперь можно приступить к созданию CGI скрипта. Заметим, что при передаче серверу запроса по методу Get, строка запроса записывается после URL скрипта, отделяясь от него символом "?". Например:

     http://localhost/cgi-bin/cgi.exe?userid=us&password=ps

    Скрипту эта строка передается в виде переменной среды окружения QUERY_STRING. Эта переменная представляет собой строку, содержащую пары значений имя=значение, отделенные друг от друга символом &. В нашем случае это будет строка вида:

USERID=user1&PASSWORD=password

Необходимо отметить, что некоторые символы, содержащиеся в значении поля, заменяются на % и следующим за ним шестнадцатиричным кодом символа, а пробел заменяется на +. Итак давайте воспользуемся предыдущим примером скрипта и вставим в модуль CGIUN следующий код:

 

// ******************************
// файл: CGIUN.pas
// ******************************
unit CGIUN;
interface
uses SysUtils, Windows;
procedure Main;
implementation
var InParams: string;
// Читаем переданные параметры из переменной окружения
procedure InitParams;
var SS: string;
begin
SetLength(SS,10000);
GetEnvironmentVariable('QUERY_STRING',@SS[1],2000);
InParams:=PChar(@SS[1]);
end;
// Функция переводит шестнадчитиричный символ в число
function HexToInt(CH: char): integer;
begin
Result:=0;
case CH of
'0'..'9': Result:=Ord(CH)-Ord('0');
'A'..'F': Result:=Ord(CH)-Ord('A')+10;
'a'..'f': Result:=Ord(CH)-Ord('a')+10;
end;
end;
// Преобразует символы, записанные в виде %2B к правильному виду
function Decode(Value: string): string;
var I, L: integer;
begin
Result:='';
L:=0;
for I:=1 to Length(Value) do begin
if(Value[I]<>'%') and (Value[I]<>'+') and (L<1) then begin
Result:=Result+Value[I];
end else begin
if(Value[I]='+') then
Result:=Result+' '
else if(Value[I]='%') then begin
L:=2;
if(I<Length(Value)-1) then begin
Result:=Result+Chr(HexToInt(Value[I+1])*16+HexToInt(Value[I+2]));
end;
end else
Dec(L);
end;
end;
end;
// Возвращает значение параметра, заданного в Name
function ParamByName(Name: string): string;
var SS, ST: string;
K: integer;
begin
Result:='';
SS:=InParams;
while Length(SS)<>0 do begin
K:=Pos('&',SS);
if(K<>0) then begin
ST:=Copy(SS,1,K-1);
SS:=Copy(SS,K+1,10000);
end else begin
ST:=SS;
SS:='';
end;
K:=Pos('=',ST);
if(K<>0) then begin
if(Name=Copy(ST,1,K-1)) then begin
Result:=Decode(Copy(ST,K+1,6000));
end;
end;
end;
end;
procedure Main;
var UserId, Password: string;
begin
InitParams;
UserId:=ParamByName('USERID');
Password:=ParamByName('PASSWORD');
WriteLn('Content-Type: text/html');
WriteLn;
WriteLn('<html>');
WriteLn('<head>');
if(UserId='user1') and (Password='password') then begin
WriteLn('<title>СGI скрипт: доступ разрешен</title>');
WriteLn('</head>');
WriteLn('<body>');
WriteLn;
WriteLn('<h1>доступ разрешен</h1>');
end else begin
WriteLn('<title>СGI скрипт: ошибка авторизации</title>');
WriteLn('</head>');
WriteLn('<body>');
WriteLn;
WriteLn('<h1>ошибка авторизации</h1>');
end;
WriteLn(' UserID: <b>'+UserId+'</b>');
WriteLn(' Password: <b>'+Password+'</b>');
WriteLn('</body>');
WriteLn('</html>');
end;
end.

    Теперь откомпилируем полученный проект и перепишем файл CGI.exe в директорию www сервера со скриптами. Теперь можно проверить работоспособность:

    1) Загрузим Login.htm и в полях UserId и Password напишем любой текст (неправильный пароль). Получим:

    2) А теперь введем правильные значения полей:

    Как видите, CGI скрипт работает правильно.

    3.2 Передача параметров методом Post

    В методе Post параметры передаются через стандартный поток ввода консольной программы. Для реализации этого метода в файле Login.htm нужно заменить строку

        <FORM ACTION="/cgi-bin/cgi.exe" METHOD="get">     на строку

        <FORM ACTION="/cgi-bin/cgi.exe" METHOD="post">

    Теперь в файле CGIUN.pas процедура InitParams будет выглядить следующим образом:

procedure InitParams; var STR: string;
StdIn, Size, Actual: cardinal; // если компилируется на Delphi 2 или 3
// то тип должен быть integer
begin
StdIn := GetStdHandle(STD_INPUT_HANDLE);
Size := SetFilePointer(StdIn, 0, nil, FILE_END);
SetFilePointer(StdIn, 0, nil, FILE_BEGIN);
SetLength(STR,Size+1);
if (Size <= 0) then Exit;
ReadFile(StdIn, STR[1], Size, Actual, nil);
STR[Size+1] := #0;
InParams:=PChar(@STR[1])
end;

Аналогично проверяем работоспособность скрипта. Результат аналогичный методу Get.

    4. Возврат CGI скриптом ссылку на другой ресурс

    Искушенный читатель может заметить, что все описанное выше конечно прекрастно, но нак быть, если необходимо вернуть ссылку на другой ресурс (например стариницу)? Для этого в технологии CGI предусмотрен следующий механизм: вместо вывода в стандартный поток html старины нужно выдать "Location:", а затем необходимый URL. Нужно не забыть, что после этой строки необходимо два раза перевести каретку. Например:

   WriteLn('Location: http://www.aport.ru/'+#10#13#10#13);     



[Назад]    [Содержание ]    [Вперед]

  


  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017