Главная » Статьи » Программирование в Delphi

Разработка CGI дополнений на Delphi
В последнее пора в взаимоотношения с подрастающей популярностью сети Интернет все чаше останавливается необходимость разработки приложений, какие бы могли работать прямо в www среде. Т.е. экие , которые бы полностью бы интегрировались в уже заурядные нам веб-странички. По сути задевала работа с таким придатком происходит целиком через излюбленный браузер пользователя и ничем не выделяется от серфинга по страничкам. Ввод данных равно как и выдача возделанных результатов приключается через html-конфигурации веб-страничек. обрабатывание же предоставленных происходит на веб-сервере. эким образом, мы получим самое что ни есть клиент-серверное приложение в его самом классическом разумении .

нужно отметить, что CGI-приложения разрабатываемые в сферах разработки ориентированных на Win32 системы, в том количестве и в Дельфи, а вернее серверная часть экого приложения может работать исключительно под Win32 сервером, так IIS из NT или Personal Web Server из Windows98. ровно касается клиентской части, то здесь никаких проблем совместимости не следовать быть в принципе, т.к. клиентская часть препровождает собой сгенерированный HTML кодировка , который поддерживается любым браузером, не важно какую платформу применяет пользователь, имейся то Win32, OS/2, Unix и др.

эким образом, программисту пишушему CGI-дополнения придется встретиться с парой основными темами - настоящее разработка веб-интерфейса и разработка непосредственно математической части дополнения .

будто касается веб-интерфейсов, то здесь желательно знать вожделея бы азбуки языка HTML. Здесь мы не будем уделять этому предназначенное внимание, стремясь знание HTML для программиста CGI-приложений очень желательно. враз же для нас хватит вполне достаточным знание эдаких основопологающих тэгов как <HTML>,<BODY> и конструкции <FORM>.

ну-кась а сейчас будем разбираться непосредственно с телом CGI-дополнения . Во-первых, как такое CGI-придаток разрабатываемое в Win32 обществу разработки? данное приложение вида Win32 CONSOLE, т.е. консольное приложение Win32. лишь вот для такого придатка в разнице от древнею Win32 консоли типовым устройством ввода является либо поля ввода HTML фигуры либо строка адреса браузера, а в особенности стандартного узлы вывода применяется окно браузера. Активизация приложения приключается непосредственно из какой-либо HTML странички, так так <A HREF="http://myhost/myapp.exe">My Application</A> словно мы ограниченном выяснили этакое CGI-приложение хватит представлять собой исполняемую Win32 код (exe), этаким веб-приложениям начато давать расширение CGI, вожделея это и непринципиально.

Для начала анализируем пример самой простой CGI-программки выдающей в окно юзерский браузера роль "HELLO WORLD".


===cut===

program MyApp

{$APPTYPE CONSOLE} // разновидность приложения Win32 консоль

{$E cgi} // Расширение приложения cgi

begin

WriteLn('Content-Type: text/html');

WriteLn;

WriteLn;

WriteLn('<HTML>');

WriteLn('<HEAD>');

WriteLn('<TITLE>Простейшее CGI придаток </TITLE>');

WriteLn('<META http-equiv="Content-Type" content="text/html;' +

' charset=windows-1251">');

WriteLn('</HEAD>');

WriteLn('<BODY>');

WrОтiteLn('<H1>HELLO WORLD</H1>');

WriteLn('</BODY>');

WriteLn('</HTML>');

end.

===cut===

Откомпиллируйте этот отправной код в среде Дельфи, втиснете скомпонованный наигрываемый код в ваш CGI-BIN каталог ( в каталог, где-нибудь разрешено игра скриптов), сочините небольшую веб страничку для активизации нашего CGI-приложения, например, этакую :


===cut==

<HTML>

<HEAD>

<TITLE>конфигурация для активизации CGI-приложения</TITLE>

</HEAD>

<BODY>

<A HREF="http://localhost/cgi-bin/myapp.cgi">

надави сюда для запуска придатка </A>

</BODY>

</HTML>

===cut==

сейчас откройте нашу веб-страничку и перейдите по ссылке "надави сюда для запуска дополнения ". Если вы все сделали верно , то на экране в окне вашего любимого браузера появиться роль "HELLO WORLD".

ровно видите все достаточно несложно ! Однако, для полноценной занятия приложения, оно должно уметь не только выводить некие данные, да получать сведения от пользователя, т.е. снабжать ввод сведению . Ввод предоставленных в эпизоде CGI-приложения, что мы ограниченном говорили, довольно осуществляться по средствам интерфейса организованного веб-фигурой . Такая фигура может подавать данные двойкой способами, в зависимости от значения определения "METHOD".

В случае <FORM METHOD="GET" ...>... сведения передаются спустя строку адреса браузера и записываются в переменную системного окружени
я QUERY_STRING, а размер строки данных в переменную CONTENT_LENGTH.

В случае <FORM METHOD="POST" ...>... вручаемые данные в строке адреса не воссоздаются , передаются спустя стандартный поток ввода консольной программы.

эким образом вопрос получения предоставленных CGI-приложением сливается к декламации определенной изменчивой окружения. надобно отметить, чисто передаваемые веб-фигурой данные имеют следующий формат: <имя_атрибута1>=<значительность _атрибута1>&<имя_атрибута2>=<важность _атрибута2>...

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

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


===cut==

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

<HTML>

<HEAD>

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

</HEAD>

<BODY>

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

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

<input type="text" name="paswd" size=20>

<input type="submit" value="отыскать ">

<input type="reset" value="ограбить ">

</FORM>

</BODY>

</HTML>

===cut==

ниже идет образец непосредственно CGI приложения. надлежит отметить, что приведенный в этом образце способ приобретения данных от веб конфигурации (непосредственное декламация устройства ординарного ввода STD_INPUT) прибывает наиболее наглядным, однако не самым удобным, в Дельфи предусмотренны более благоприятные механизмы, каких мы каснемся позже.

===cut== 

{Файл проекта 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('<HTML>');

WriteLn('<HEAD>');

WriteLn('<TITLE>Идентификация пользователя</TITLE>');

WriteLn('<META http-equiv="Content-Type" content="text/html;'+

' charset=windows-1251">');

WriteLn('</HEAD>');

WriteLn('<BODY>');

if APasswd = UserPassword then

WriteLn('<H1>благополучная идентификация!</H1>')

else

WriteLn('<H1>Пароль введен неуверенно !</H1>')

WriteLn('</BODY>');

WriteLn('</HTML>');

end;

===cut==


Источник: http://www.yandex.ru
Категория: Программирование в Delphi | Добавил: Nikol05 (10.11.2010)
Просмотров: 2808 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]