WebMasterok
Главная
Вход
Регистрация
Среда, 08.01.2025, 07:00Приветствую Вас Гость | RSS
Меню сайта

Главная » 2013 » Март » 25 » CGI-приложения
11:36
CGI-приложения
На самом деле дела работа с 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 приложений на Дельфи.
Просмотров: 347 | Добавил: Romik72 | Теги: скрипты | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0