Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Gabdullina_Alina_kursovaya.doc
Скачиваний:
16
Добавлен:
23.08.2019
Размер:
1.54 Mб
Скачать

П3. Разработка сервера Web Services в Delphi6

Delphi 6 позволяет создавать как сервера, так и клиентов Web Services. Мы начнем рассмотрение с создания сервера. Создание сервера Web Services в Delphi6 состоит из следующих этапов:

  1. Описание интерфейса сервера, то есть методов, которые будут доступны для вызова клиенту;

  2. Реализация методов сервера;

  3. Создание проекта Delphi и включение в него результатов первых двух шагов.

Последовательно опишем каждый из этапов.

П4. Описание интерфейса сервера

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

unit u_Intrf;

interface

type

  IEncodeDecode = interface(IInvokable)

    ['{32B3312E-684C-444D-88DB-13DE6F535F6D}']

    // Конвертация долларов в рубли

    function US2RUS(Value: Currency): Currency; stdcall;

    // Конвертация рублей в доллары

    function RUS2US(Value: Currency): Currency;

stdcall;

end;

implementation

uses  InvokeRegistry;

initialization

  InvRegistry.RegisterInterface(TypeInfo(IEncodeDecode));

end.

Обратите внимание, что строка   ['{32B3312E-684C-444D-88DB-13DE6F535F6D}'] – это GUID интерфейса, для корректной работы примера Вам необходимо сгенерировать его, а не вводить вручную или копировать из приведенного текста. Генерация GUID в IDE Delphi вызывается нажатием Ctrl+Shift+G. В случае использования в функциях интерфейсе скалярных типов данных генерация SOAP сообщений происходит автоматически без дополнительных усилий со стороны программиста. Если же Вы хотите использовать сложные типы данных, такие как статические массивы, наборы и классы, то необходимо создать и зарегистрировать класс-наследник от TRemotableXS и переопределить методы XSToNative и NativeToXS. Данные методы конвертируют строковое и бинарное представление Ваших данных друг в друга

П5. Реализация методов сервера

Наиболее простым способом реализации интерфейса на сервере является создание и регистрация в invocation реестре класса-наследника от TInvokableClass. Класс TInvokableClass имеет две замечательные особенности:

  • Invocation реестр знает о том, как создать экземпляр этого класса и его наследников при запросе клиентом вызовов методов интерфейса.

  • Так как класс TinvokableClass наследник TInterfacedObject, то он умеет освободить память в случае, когда число ссылок на него равно 0, что облегчает программисту жизнь.

Текст модуля реализации представлен ниже, комментарии излишни:

unit u_Impl;

interface

uses InvokeRegistry, u_Intrf;

type

  TEncodeDecode = class(TInvokableClass, IEncodeDecode)

  protected

    function US2RUS(Value: Currency): Currency; stdcall;

    function RUS2US(Value: Currency): Currency; stdcall;

  end;

implementation

{ TEncodeDecode }

function TEncodeDecode.RUS2US(Value: Currency): Currency;

begin

  Result := Value / 30;

end;

function TEncodeDecode.US2RUS(Value: Currency): Currency;

begin

  Result := Value * 30;

end;

initialization

  InvRegistry.RegisterInvokableClass(TEncodeDecode);

end.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]