Итак, что такое CGI? Что это такое, документацию, статьи вы можете найти в
интернете. Для платформы WIN32 существует три вида CGI интерфейса,
поддерживаемых Delphi.
- ISAPI - Стандарт Internet Server API изначально был создан как Microsoft
Information Server API, но в дольнейшем был предложен в качестве открытого
стандарта.
- NSAPI - Стандарт Netscape Server API используется для взаимодействия с
серверами компании Netscape
- CGI - Common Gateway Interface (стандартный интерфейс шлюза) был первой
попыткой интеграции WWW-серверов и отдельных программ.
- WinCGI - Windows вариант CGI
Поскольку компании Netscape приняла стандарт ISAPI, в данный момент реально
существует единый формат для Internet Information Server (IIS) и серверов
компании Netscape. Поэтому воспользуемся предоставляемым Delphi инструментарием
для создания ISAPI DLL, которая будет отвечать на запросы клиентов.
Создание ISAPI библиотеки
Создание ISAPI DLL похоже на разработку любой стандартной DLL. Для этого
необходимо загрузить Delphi, в меню File выбрать пункт New,
затем в диалоговом окне New Items выбрать пиктограмму Web Server Application
и нажать кнопку OK. Появится диалоговое окно New Web Server Application.
Пункт ISAPI/NSAPI Dynamic Link Library выбран по умолчанию, поэтому нажимаем
кнопку OK.
Вы попали в интерактивную среду разработки ISAPI расширения сервера. В вашем
проекте содержится специальный модуль WebModule, он позволяет помещать в него
различные компоненты и обеспечивает работу с ними.
Если дважды щелкнуть мышкой на WebModule, появится Action Editor,
предназначенное для создания и редактирования обработчиков событий ActionItem.
Для создания ActionItem следует нажать кнопку Add New, при этом в окне Object
Inspector отобразятся свойства и события созданного ActionItem.
Специальные компоненты, облегчающие создание динамических страниц
расположены , также, на странице Internet палитры компонентов. Это -
PageProduсer и ему подобные, предназначенные для генерации динамических HTML
страниц.
Познакомимся с основными объектами и классами ISAPI поближе.
WebModule
WebModule - автоматически создаваемый модуль для приложений
Web-сервера.
Когда новое Web приложение создано, оно автоматически содержит
WebModule . Это дает возможность созданному Web приложению ответить на
запрос HTTP, пропуская запрос и ответ к соответствующим обработчикам
ActionItems . Приложение может содержать только один WebModule .
WebModule имеет два важных свойства Request и
Response с которыми мы познакомимся немного позже, а также события:
OnCreate |
Происходит когда приложение создает WebModule .
Следует использовать это событие для инициализации переменных и
объектов, содержащихся в приложении. Например, если модуль содержит
базу данных, приложение может установить подключение базы данных.
|
OnDestroy |
Происходит перед уничтожением WebModule .
Используйте это событие для освобождения объектов, созданных
динамически в приложении. |
BeforeDispatch |
Происходит перед тем, как диспетчер устанавливает соответствие
запроса HTTP с каким-либо ActionItems . Используйте
обработчик события BeforeDispatch для предварительной
обработки HTTP запроса. |
AfterDispatch |
Происходит после того, как HTTP ответ был успешно сформирован
ActionItems , но еще не передан клиенту. Используйте
обработчик события AfterDispatch , например, для
проверки сформированного HTTP ответа. |
Request
Request - автоматически создаваемый объект WebModule .
Request представляет текущий HTTP запрос в удобной форме для
обработки. Об отдельных свойствах этого компонента следует сказать особо.
ContentFields |
Педоставляет содержимое полей POST запроса. Используйте
ContentFields , чтобы читать содержимое полей запроса HTTP,
при использовании метода POST. |
QueryFields |
Педоставляет параметры и их значение в случае передачи их
запросом в URL документа. Используйте QueryFields ,
чтобы читать поля запроса HTTP, при использовании метода в котором
параметры передаются в URL документа, например метод GET. |
ContentFields и QueryFields возвращаю параметры
передаваемые клиентом, это обьекты наследованные от класса TStrings ,
данные в них представлены в виде имя = значение.
Response
Response - также автоматически создаваемый объект WebModule.
Объект Response содержит информацию, которая будет передана
клиенту, в результате обработки запроса. Заполнять Response
необходимо вам. После того как все свойства будут заполнены, будет сформирован
HTTP ответ, который и будет передан клиенту.
Среди свойств объекта Response следует обратить внимание на:
ContentType |
Указывает тип содержимого HTTP ответа в соответствии со
спецификацией MIME. Используйте ContentType , чтобы
установить тип содержимого передаваемого клиенту, например, если вы
передаете изображение в формате GIF, вы должны установить
ContentType = 'image/gif' . |
Content |
Содержит информацию, передаваемую клиенту в ответ на сообщение
запроса HTTP. Используюте Content , чтобы передать
требуемую информацию клиенту. |
ContentStream |
Определяет Stream объект, который будет передан
клиенту. Используйте ContentStream для передачи клиенту
содержимого отличного от ContentType = 'text/*' ,
например при передаче бинарного файла. Если свойство
ContentStream установлено, оно заменяет свойство
Content . |
Как это работает
В общем случае так. При выполнении HTTP запроса, веб сервер запускает на
выполнение ваше ISAPI приложение.
Создается объект Application , порожденный от
TISAPIApplication или TCGIApplication .
TISAPIApplication и TCGIApplication в свою очеродь имеют
общего предка TWebApplication и перекрывают все его виртуальные
методы. Объект Application создается автоматически от нужного
класса, в зависимости от того, какой тип (ISAPI или CGI) приложения Вы выбрали,
об этом заботится визард Delphi.
Следующим автоматически создается объект WebModule , созданный от
класса TWebModule , и генирируется событие TWebModule.OnCreate .
Затем WebModule создает все обьекты ActionItems и
генерирует событие TWebModule.BeforeDispatch . После обработки
события BeforeDispatch назначается обьект ActionItem ,
котрый получает возможность обработать запрос. Обработку запроса и формирование
ответа должны производить Вы, анализируя обьект Request и заполняя
Response . Все это можно сделать на событии
ActionItem.OnAction . В большинстве случаев, для того чтобы сформировать
ответ необходимо заполнить свойство Content обьекта Response .
После отработки собития OnAction обьекта (или обьектов)
ActionItem происходит формирование HTTP ответа и генерируется событие
TWebModule.AfterDispatch , затем ответ отсылается клиенту.
Следующим, последним, событием генерируется TWebModule.OnDestroy .
Внимание:В случае ISAPI приложения, объект WebModule может быть создан
один раз и не создаваться при каждом запросе, следовательно не будут
генерироваться события OnCreate и OnDestroy объекта WebModule.
|