Главная » Статьи » Программирование в 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 | |
Просмотров: 2808 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |