|
||||||||
|
Написание 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> Запишем этот текст в файл 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 |