Создание автономной Web-службы в Delphi 7 с помощью комплекта Indy. Часть 1Серж Досюков (Serge Dosyukov) Майк Фэм (Mike Pham)
Оглавление
В статье рассказывается о том, как создать автономную Web-службу, используя комплект Indy и Delphi 7 и как использовать комплект Indy для осуществления поддержки в Delphi 7 Web-служб на основе протокола SOAP. За дополнительной информацией о создании Web-служб рекомендуем обратиться к великолепной статье Ника Ходжеса (Nick Hodges) на сайте сообщества Borland: "Шекспир в сети". Рано или поздно может возникнуть необходимость создания сервера, который являлся бы автономным HTTP-сервером и осуществлял поддержку Web-служб. Например, может понадобиться создать сервер приложений на основе протокола SOAP для n-уровневого приложения, созданного с помощью Delphi. ВведениеИнтерактивная справка Delphi предоставляет великолепную последовательную инструкцию о том, как создать Web-службу, MIDAS-сервер (COM, DCOM-модель), но в ней практически отсутствует информация о создании автономного n-уровневого MIDAS-приложения на основе протокола SOAP. Ранее была опубликована статья Дэйва Нотажа (Dave Nottage). В этой статье была описана идея о том, как создать в Delphi 6 Web-службу с поддержкой SOAP и возможностью публикации SOAP-интерфейсов модуля Datamodule, то есть эта статья позволяла научиться создавать собственные n-уровневые MIDAS-системы. Выпущенные компанией Borland Delphi 7 и новый комплект Indy обладают встроенной поддержкой такой функциональности. Однако, несмотря на встроенную поддержку, документальное описание этой возможности отсутствует. Недавние сообщения в сетевой конференции Borland и поиск в сети с помощью сервера Google, позволили авторам разработать способ преобразования существующего кода из Delphi 6 в Delphi 7. Но - всему свое время. Основная идеяДанная статья является первой частью цикла из трех статей. В ней описываются основные положения. Вторая и третья части будут посвящены некоторым проблемам и способам их решения. Приступим к описанию основной идеи. Далее будет описано, как создать приложение, поддерживающее следующий набор функциональных возможностей:
HTTP-сервер и SOAPМногие знают Indy и использовали компоненты THTTPServer раньше. Несложно поместить этот компонент на форму приложения, но как заставить его поддерживать SOAP? В каталоге "C:Program FilesBorlandDelphi7SourceIndy" можно найти файл IdHTTPWebBrokerBridge.pas. Это как раз то, что нужно. Этот файл не является частью исполняемого модуля Indy, поэтому нужно включить его в текущий проект в качестве стандартного проектного файла. (Для компиляции проекта также понадобится файл IdCompilerDefines.inc.) Данные файлы необходимо скопировать в каталог текущего проекта. Для увеличения скорости может потребоваться изменения кода, так что эти файлы лучше хранить отдельно от дистрибутива Indy. Далее описывается реализация замещения компонента из THTTPServer, расширенного для поддержки пакетов SOAP и называющегося TIdHTTPWebBrokerBridge. Эта конструкция является классом, наследуемым от TCustomHTTPServer и поддерживающим базовую привязку запросов. Так как этот класс недоступен из палитры, необходимо будет определить его как регулярный объект при выполнении программного кода. Этот объект можно использовать точно таким же образом, как и обычный THTTPServer, за исключением тех дополнительных свойств, которые обеспечивают работу с SOAP. WebBroker и IndyТем, кому раньше приходилось создавать Web-службы, известно, что для этого используется WebBroker. Delphi 7, также как и Delphi 6, использует архитектуру WebBroker для поддержки SOAP. Поэтому нужно создать модуль TWebModule и поместить в него следующие три компонента: THTTPSoapDispatcher, THTTPSoapPascalInvoker и TWSDLHTMLPublish. Все они доступны из вкладки WebServices палитры компонентов. После связывания SOAPDispatcher с SOAPPascalInvoker форма приложения готова. В качестве конечного результата должно получится нечто вроде того, что изображено на следующем рисунке : (модуль uWebModule.pas) Лучше все оставить как есть, так как нет необходимости изменять или исполнять какой-либо собственный код для данной формы. WebModule и IndyПерейдем к другой части кода, необходимой для реализации HTTP-сервера. Как можно заметить TIdHTTPWebBrokerBridge обладает методом RegisterWebModuleClass, который позволяет зарегистрировать собственный модуль WebModule и сделать его доступным для сервера. Таким образом, после создания серверного объекта fServer, нужно просто вызвать класс fServer.RegisterWebModuleClass (TwmSOAPIndy). Примечание. При обычной реализации TIdHTTPWebBrokerBridge объект TwmSOAPIndy будет создаваться каждый раз когда приходит запрос. Очевидно, что в этом нет необходимости. Поэтому класс можно модифицировать так, чтобы обеспечить перманентное создание данного объекта в течении времени пока существует объект Server. За дополнительной информацией рекомендуется обратиться к документации о реализации классов. Готов ли сервер?Может возникнуть вопрос: "Что же дальше?". Почти ничего - сервер готов к работе. Осталось только добавить модуль TSoapDataModule и реализацию бизнес-логики и сервер будет совершенно готов. Служба? - Это не сложноТак как в данном примере рассматривается только обыкновенное приложение, то оно может быть преобразовано в службу обычным образом. Ничего особенного делать не нужно. Единственно, следует помнить о том, что если подключения к базам данных являются доверительными (trusted), то сервис должен имеет специальную учетную запись для входа в сервер БД. Для изменения учетной записи, используемой службой для начала работы, можно использовать учетную запись пользователя. ПримерСледуйте ссылке, чтобы посмотреть пример приложения, который демонстрирует применение вышеизложенного. Данное приложение является автономным сервером с поддержкой SOAP. Оно обладает SOAP-интерфейсом и системой CDS, доступной для клиентских приложений через SOAP/MIDAS-интерфейс. В серверной части показан подсчет операций с базами данных, выполненных на сервере. Щелкнув на кнопку "Hello", можно увидеть результат вызова удаленного интерфейса. |