ISAPI / NSAPI
Итак, что такое 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.