Створення автономної Web-служби в Delphi 7 за допомогою комплекту Indy. Частина 1

Зміст



У статті розповідається про те, як створити автономну 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", можна побачити результат виклику віддаленого інтерфейсу.

Частина 2

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*