Майстри delphi, еволюція засобів розробки web додатків в delphi (документація, вихідні коди,

Використання Web Services

Що таке Web Service

протокол SOAP

POST / examples HTTP / 1.1
User-Agent: Radio UserLand / 7.0 (WinNT)
Host: localhost: 81
Content-Type: text / xml; charset = utf-8
Content-length: 474
SOAPAction: "/ examples"

Розглянемо заголовок запиту. Формат URI в першому рядку запиту не специфікований. Наприклад це може бути просто / або, як у нашому прикладі / examples.
User Agent і Host повинні бути вказані. Content-Type, тобто тип вмісту запиту, природно, text / xml. Content-Length - lліна запиту.
SoapAction - значення даного поля використовується для передачі повідомлення потрібного обробника повідомлень сервера. Як правило, значення SoapAction збігається з URI в першому рядку запиту.
Тіло запиту є документ у форматі XML. Кореневої тег SOAP-ENV: Envelop містить в собі тег SOAP-ENV: Body, що містить опис викликається процедури. У нашому прикладі повідомлення описує запит на виклик процедури getStateName з параметром statenum рівним 41.
Відповідь сервера при успішному виклику виглядає так:

Відзначимо лише найбільш важливі моменти:
  • Простір імен в описі відповіді (тег ) Повинен збігатися з простором імен в запиті. У нашому прикладі простір імен - m
  • Ім'я тега опису відповіді формируемся додаванням слова Response до імені викликається процедури. У нашому випадку це m: getStateNameResponse

Розробка сервера Web Services в Delphi6

Delphi 6 дозволяє створювати як сервера, так і клієнтів Web Services. Ми почнемо розгляд з створення сервера.
Створення сервера Web Services в Delphi6 складається з наступних етапів:
  1. Опис інтерфейсу сервера, тобто методів, які будуть доступні для виклику клієнту;
  2. Реалізація методів сервера;
  3. Створення проекту Delphi і включення в нього результатів перших двох кроків.

Послідовно опишемо кожен з етапів.

Опис інтерфейсу сервера


У Delphi при створенні сервера Web Services методи доступні для виклику клієнту описуються у вигляді invokable інтерфейсів. Invokable інтерфейс - це інтерфейс для методів якого доступна RTTI (інформація про типи на етапі виконання). Для того щоб зі звичайного інтерфейсу зробити invokable досить вказати директиву компіляції. Після цього всі нащадки і сам інтерфейс міститимуть RTTI. В ієрархії VCL вже є такий інтерфейс IInvokable. Таким чином, при написанні сервера найпростіше успадкувати свій інтерфейс від Iinvokable. Крім того необхідно зареєструвати свій інтерфейс в invocation registry. Реєстрація дозволяє серверу визначити клас, який реалізує методи інтерфейсу, а клієнту отримати опис методів, підтримуваних сервером. Реєстрація здійснюється викликом методу InvRegistry.RegisterInterface в секції initialization модуля.
Так як інтерфейс використовується не тільки сервером, але і клієнтом, то бажано визначити його в окремому модулі Delphi.
Для прикладу ми розробимо сервер, який буде здійснювати перерахунок грошей з доларів на рублі і назад. В IDE Delphi виберемо пункт меню File / New / Unit. В отриманому порожньому модулі визначимо інтерфейс сервера:

Зверніть увагу, що рядок [ ''] - це GUID інтерфейсу, для коректної роботи прикладу Вам необхідно згенерувати його, а не вводити вручну або копіювати з наведеного тексту. Генерація GUID в IDE Delphi викликається натисканням Ctrl + Shift + G.
У разі використання у функціях інтерфейсі скалярних типів даних генерація SOAP повідомлень відбувається автоматично без додаткових зусиль з боку програміста. Якщо ж Ви хочете використовувати складні типи даних, такі як статичні масиви, набори і класи, то необхідно створити і зареєструвати клас-спадкоємець від TRemotableXS і перевизначити методи XSToNative і NativeToXS. Дані методи конвертують строкове і бінарне представлення Ваших даних один в одного.

Реалізація методів сервера

У разі, якщо Ви не хочете наслідувати клас від TInvokableClass, необхідно створити і зареєструвати метод-фабрику класу, який зможе створювати екземпляри Вашого класу. Метод повинен бути типу TCreateInstanceProc = procedure (out obj: TObject); При цьому екземпляр повинен вміти ліквідувати себе, якщо кількість посилань використовують його клієнтів стане нульовим. При реєстрації такого класу методу InvRegistry.RegisterInvokableClass другим параметром необхідно передати ім'я методу-фабрики класу.

Створення проекту програми Web Services в Delphi

Залишився останній крок - створення проекту програми. В IDE виберемо пункт меню File / New / Other і з закладки WebServices значок SOAP Server Application. Буде виведений діалог вибору формату додатки Web Services. Ми виберемо CGI формат. При цьому буде створено проект з Web модулем, що містить три компоненти: HTTPSoapDispatcher, HTTPSoapPascalInvoker, WSDLHTMLPublish.

THTTPSoapDispatcher отримує і обробляє SOAP повідомлення, перенаправляючи їх invoke інтерфейсів, зареєстрованим в додатку. Таким чином, THTTPSoapDispatcher є диспетчером, відповідальним за прийом, розподіл і відправку SOAP повідомлень.
Інтерпретація запитів і виклик методів інтерфейсів здійснюється іншим компонентом, зазначеним у властивості Dispatcher (HTTPSoapPascalInvoker1). THTTPSoapDispatcher автоматично реєструє себе в Web модулі, як автодиспетчера. При цьому всі запити передаються THTTPSoapDispatcher, що позбавляє Вас від необхідності створювати обробники запитів Web модуля.

Майстри delphi, еволюція засобів розробки web додатків в delphi (документація, вихідні коди,

WSDLHTMLPublish1 - даний компонент генерує і видає за запитом клієнта опис інтерфейсу сервера.
Далі в проект необхідно підключити файли з описом і реалізацією інтерфейсу. Для цього в IDE виберемо пункт меню Project / Add to project і діалозі виберемо модулі з описом і реалізацією методів інтерфейсу. Можна відкомпілювати проект і помістити отриманий виконуваний файл в директорію для CGI скриптів Web сервера.
Сервер готовий до роботи.

Розробка клієнта Web Services в Delphi6

Майстри delphi, еволюція засобів розробки web додатків в delphi (документація, вихідні коди,

Збережіть його в файл Client.xml. Отже, тим або іншим способом файл з описом в форматі xml виявився у нас в руках, тепер необхідно експортувати його в Delphi. При експорті буде згенеровано модуль Delphi з описом інтерфейсу на мові Object Pascal. Виберемо пункт меню File / New / Other, перейдемо на закладку WebServices і виберемо іконку Web Services Importer. При цьому на екрані з'явиться діалог імпорту опису.

Майстри delphi, еволюція засобів розробки web додатків в delphi (документація, вихідні коди,

Використовуючи кнопку Browse діалогу, вкажемо отриманий раніше файл Client.xml, і натиснемо кнопку Generate. Опа і модуль Delphi з описом інтерфейсу готовий. Переходимо до другого етапу - безпосереднього створення клієнта. Створимо заготовку нової програми - File / New / Application. На головній формі розмістимо рядок введення, дві кнопки і компонент HTTPRIO з закладки WebServices.

Майстри delphi, еволюція засобів розробки web додатків в delphi (документація, вихідні коди,

Залишилося запустити проект на виконання і переконатися в його працездатності. У даній статті ми розглянули лише найпростіший приклад. Сподіваюся, вона стане для Вас хорошим стартом в освоєнні нових Web технологій.