На самом деле дела работа с CGI приложением происходит вполне через возлюбленный браузер юзера и ничем не отличается от серфинга по страницам. Ввод данных равно как и выдача обработанных результатов происходит через html-формы веб-страничек. Обработка же данных происходит на веб-сервере. Таким макаром, мы получим самое что ни есть клиент-серверное приложение в его самом традиционном осознании.
Нужно отметить, что CGI-приложения разрабатываемые в средах разработки нацеленных на Win32 системы, в том числе и в Дельфи, а точнее серверная часть такового приложения может работать только под Win32 сервером, к примеру IIS из NT либо Personal Web Server из Windows98. Что касается клиентской части, то тут никаких заморочек сопоставимости не должно быть в принципе, т.к. клиентская часть представляет собой сгенерированный HTML код, который поддерживается хоть каким браузером, не принципиально какую платформу употребляет юзер, будь то Win32, OS/2, Unix и др.
Таким макаром, программеру пишушему CGI-приложения придется столкнуться с 2-мя основными задачками - это разработка веб-интерфейса и разработка конкретно математической части приложения.
Что касается веб-интерфейсов, то тут лучше знать хотя бы базы языка HTML. Тут мы не будем уделять этому особенное внимание, хотя познание HTML для программера CGI-приложений очень лучше. На данный момент же для нас будет полностью достаточным познание таких основопологающих тэгов как, и конструкции.
Ну а сейчас будем разбираться конкретно с телом CGI-приложения. Во-1-х, что такое CGI-приложение разрабатываемое в Win32 среде разработки? Это приложение типа Win32 CONSOLE, т.е. консольное приложение Win32. Только вот для такового приложения в отличии от традиционной Win32 консоли стандартным устройством ввода является или поля ввода HTML формы или строчка адреса браузера, а в качестве стандартного устройства вывода употребляется окно браузера. Активизация приложения происходит конкретно из какой-нибудь HTML страницы, к примеру так:
Код: <A HREF="http://myhost/myapp.exe">My Application</A>
Как мы уже узнали такое CGI-приложение будет представлять собой исполняемую Win32 программку (exe), таким веб-приложениям принято давать расширение CGI, хотя это и беспринципно.
Для начала разглядим пример самой обычной CGI-программки выдающей в окно пользовательского браузера текст "HELLO WORLD".
Код: program MyApp
{$APPTYPE CONSOLE} // тип приложения Win32 консоль
{$E cgi} // Расширение приложения cgi
begin
WriteLn('Content-Type: text/html');
WriteLn;
WriteLn;
WriteLn('');
WriteLn('');
WriteLn('Простейшее CGI приложение');
WriteLn('');
WriteLn('');
WriteLn('');
WrОтiteLn('<H1>HELLO WORLD</H1>');
WriteLn('');
WriteLn('');
end.
Откомпиллируйте этот начальный код в среде Дельфи, расположите скомпонованный исполняемый код в ваш CGI-BIN каталог ( в каталог, где разрешено выполнение скриптов), напишите маленькую интернет страницу для активизации нашего CGI-приложения, к примеру, такую:
Код:
Форма для активизации CGI-приложения
<A HREF="http://localhost/cgi-bin/myapp.cgi">
Нажми сюда для пуска приложения</A>
Сейчас откройте нашу веб-страничку и перейдите по ссылке "Нажми сюда для пуска приложения". Если вы все сделали верно, то на дисплее в окне вашего возлюбленного браузера показаться текст "HELLO WORLD".
Видите ли все довольно просто! Но, для настоящей работы приложения, оно должно уметь не только лишь выводить некоторые данные, но получать данные от юзера, т.е. обеспечивать ввод инфы. Ввод данных в случае CGI-приложения, как мы уже гласили, будет осуществляться по средствам интерфейса организованного веб-формой. Такая форма может передавать данные 2-мя методами, зависимо от значения атрибута "METHOD".
В случае... данные передаются через строчку адреса браузера и записываются в переменную системного окружения QUERY_STRING, а размер строчки данных в переменную CONTENT_LENGTH.
В случае... передаваемые данные в строке адреса не показываются, передаются через стандартный поток ввода консольной программки.
Таким макаром задачка получения данных CGI-приложением сводится к чтению определенной переменной окружения. Нужно отметить, что передаваемые веб-формой данные имеют последующий формат: = & =...
Задачка программера сводится к извлечению значений подходящих атрибутов из приобретенной от браузера строчки и преобразования этих значений из вида URLencoded в обыденные текстовые данные. Сущность URLencoded формата состоит в том, что некие знаки, находящиеся в значении поля, заменяются на % и последующим за ним шестнадцатиричным кодом знака, а пробел заменяется на +.
А на данный момент давайте разглядим пример CGI приложения, которое бы производило подобие некой идентификации юзера системы.
Код:
<!-- HTML форма ввода пароля -->
Авторизация доступа
<FORM method="POST">
Введите пароль:
<input type="text" name="paswd" size="20" />
<input type="submit" value="Найти" />
<input type="reset" value="Очистить" />
</FORM>
Дальше идет пример конкретно CGI приложения. Необходимо подчеркнуть, что приведенный в этом примере метод получения данных от интернет формы (непосредственное чтение устройства стандартного ввода STD_INPUT) является более приятным, но не самым комфортным, в Дельфи предусмотренны более комфортные механизмы, которых мы каснемся позднее.
Код: {Файл проекта CGIApp2}
program CGIApp2;
{$APPTYPE CONSOLE}
uses
MainUn in 'MAinUn.pas';
{$E cgi}
begin
Main;
end.
program MainUn;
interface
uses
SysUtils, Windows, Classes;
implementation
// Функция перевода шестнадцетиричного знака в число
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;
// Конвертирует знаки, записанные в виде URLencoded
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;
// Фнкция возвращает значение атрибута данного
//в качестве параметра функции из строчки данных
//считанной из устройства стандартого ввода.
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
STR: string;
StdIn, Size, Actual: cardinal;
InParams: string;
const
UserPassword : string = 'MyPass';
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]);
APasswd := ParamByName('paswd');
WriteLn('Content-Type: text/html');
WriteLn;
WriteLn;
WriteLn('');
WriteLn('');
WriteLn('Идентификация пользователя');
WriteLn('<META http-equiv="Content-Type" content="text/html;'+
' charset=windows-1251">');
WriteLn('');
WriteLn('');
if APasswd = UserPassword then
WriteLn('<H1>Успешная идентификация!</H1>')
else
WriteLn('<H1>Пароль введен неверно!</H1>')
WriteLn('');
WriteLn('');
end;
Ну, вот пока все. Но это совершенно не означает, что мы вполне окутали всё, что касается разработки CGI приложений на Дельфи.
|