Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Delphi6 и Web-сервисы

Оформил: DeeCo

В настоящей статье мы вновь возвращаемся к уже неоднократно обсуждавшейся нами теме Web-сервисов, представляющих собой технологию интеграции Web-приложений. Сегодня мы рассмотрим, как можно использовать Web-сервисы в Windows-приложениях, созданных с помощью Borland Delphi 6, а также как с помощью этого же средства разработки создавать собственные Web-сервисы. Отметим, что на момент написания данной статьи, когда выход окончательной версии Visual Studio .Net еще только ожидается в обозримом будущем, Delphi 6 является единственным средством разработки, поддерживающим создание Web-сервисов.

В течение последних нескольких лет мы наблюдаем качественные изменения, которые претерпевает World Wide Web. Если еще пять-семь лет назад WWW представляла собой главным образом совокупность серверов, содержащих статические документы со ссылками друг на друга, то современный Web практически невозможно представить без интерактивных Web-приложений, обрабатывающих и помещающих в базы данных пользовательский ввод, динамически генерирующих страницы на скриптовых языках по запросу пользователя и обслуживающих таким образом тот или иной бизнес, равно как и без широкого спектра технологий, реализующих подобную функциональность (CGI, ISAPI, ASP, JSP и т.д.).

Отметим, однако, что эволюция WWW не остановилась на Web-приложениях. Взаимная интеграция бизнесов различных компаний, происходящая сейчас во всем мире, неизбежно влечет за собой появление технологий и стандартов интеграции обслуживающих их приложений и корпоративных информационных систем. Наиболее популярной технологией такой интеграции в настоящее время следует назвать обмен данными в формате XML (eXtensible Markup Language) по протоколу SOAP (Simple Object Access Protocol) и создание Web-сервисов, применяющих подобный обмен данными.

Web-сервис — это, по существу, объект, реализующий один или несколько методов, к которым можно обращаться через Internet из какого-либо другого приложения. Для описания методов, предоставляемых конкретным Web-сервисом (то есть его программного интерфейса), создается и делается доступным специальный документ на языке WSDL (Web Service Definition Language), являющемся подмножеством языка XML. Отметим, что для поиска Web-сервисов в Сети планируется использовать реестры UDDI (Universal Description, Diiscovery and Integration), в которых Web-сервисы регистрируются их провайдерами для того, чтобы их могли найти разработчики. Web-сервисы, по существу, позволяют создавать распределенные приложения, части которых могут функционировать на любых платформах и располагаться в произвольных местах, что делает эту технологию весьма привлекательным средством интеграции корпоративных приложений. Более подробно о стандартах и средствах разработки Web-сервисов можно прочесть в статье Алексея Федорова «Web нового поколения — Web-сервисы» (см. КомпьютерПресс № 6’2001).

Поскольку Web-сервисы являются относительно новой технологией, о поддержке их применения и тем более создания на уровне компонентов, классов или экспертов для их создания во всех без исключения средствах разработки говорить пока еще рано. Отметим, однако, что такие средства разработки уже имеются или должны появиться в ближайшем будущем. В частности, создание Web-сервисов поддерживается в Delphi 6, выпущенной летом нынешнего года. Ниже мы рассмотрим два простейших примера, иллюстрирующих возможности применения и создания Web-сервисов с помощью этого очень популярного в нашей стране средства разработки. Предполагается, что с созданием приложений с помощью Delphi читатели уже знакомы.

Использование Web-сервиса в приложении

Для создания клиентского приложения, использующего готовый Web-сервис, следует в общем случае иметь подключение к Internet на время разработки, поскольку в процессе создания такого приложения требуется обращение к WSDL-файлу. В данном примере мы воспользуемся одним из бесплатных или shareware-сервисов, ссылки на которые можно найти в Web, например на сайте http://www.xmethods.org/ (список некоторых общедоступных Web-сервисов различных производителей на этом сайте представлен и в виде обычной HTML-страницы, и как UDDI-интерфейс и насчитывает на сегодня несколько десятков более или менее полезных Web-сервисов).

Выберем для создания примера Web-сервис Temperature Converter, разработанный британской компанией Lucin (http://www.lucin.com/). WSDL-описание этого сервиса находится по адресу http://sal006.salnetwork.com:83/a1vbcode/temperature/ctemperature.xml.

Для начала запустим Delphi 6 и создадим проект обычного Windows-приложения. Затем, выбрав из среды разработки пункт меню File | New | Other, откроем репозитарий объектов и выберем в нем на странице Web Services пиктограмму Web Sertvice Importer.

Далее в строке WSDL or XML Schema Location (Filename or URL) диалогового окна Web Services Import следует ввести URL WSDL-файла, содержащего описание выбранного нами Web-сервиса — http://sal006.salnetwork.com:83/a1vbcode/temperature/ctemperature.xml.

После этого среда разработки обратится по указанному адресу к этому файлу и на его основе сгенерирует модуль, содержащий интерфейс для активизации Web-сервиса и доступа к его методам (наследник интерфейса IInvokable). В данном случае сгенерированный код имеет следующий вид:

unit cln2;

interface

uses Types, XSBuiltIns;

type
  Temperature_ctemperaturePortType = interface(IInvokable)
    ['{B71C70ED-370D-4FC5-914C-496FFB5BA3ED}']
    function CelsiusToFahrenheit(const Celsius: Double): Double; stdcall;
    function FahrenheitToCelsius(const Fahrenheit: Double): Double; stdcall;
    function FahrenheitToKelvin(const Fahrenheit: Double): Double; stdcall;
    function CelsiusToKelvin(const Celsius: Double): Double; stdcall;
    function KelvinToCelsius(const Kelvin: Double): Double; stdcall;
    function KelvinToFahrenheit(const Kelvin: Double): Double; stdcall;
  end;

implementation
uses InvokeRegistry;

initialization
  InvRegistry.RegisterInterface(TypeInfo(Temperature_ctemperaturePortType), '',
    '', '', 'Temperature.ctemperaturePortType');
end.

Как мы видим, используемый Web-сервис реализует шесть методов, конвертирующих друг в друга разные температурные шкалы. Воспользуемся одним из них — FahrenheitToCelsius, переводящим значение температуры в градусах Фаренгейта в соответствующее значение в градусах Цельсия (это любимая задача российских граждан, изучающих прогнозы погоды с помощью американских сайтов). Сошлемся на сгенерированный модуль из модуля, связанного с главной формой приложения с помощью пункта меню File | Use Unit.

Далее следует позаботиться о наличии в приложении объекта, отвечающего за удаленную активизацию Web-сервиса и, следовательно, хранящего сведения о его местоположении. Для этой цели в палитре компонентов на странице Web Services имеется компонент THTTPRIO (RIO означает Remote Invokable Object). Поместим этот компонент на форму и присвоим его свойству WSDLLocation URL WSDL-описания Web-сервиса. После этого попытаемся установить значения свойства Service (это свойство содержит список интерфейсов, предоставляемых Web-сервисом, — их имена уже имеются в сгенерированном интерфейсном модуле) или свойства Port (содержит имя порта, определенного в WSDL-файле и устанавливающего местоположение Web-сервиса, и протокол, применяемый для обращения к нему). Среда разработки снова обратится к WSDL-описанию Web-сервиса, получив на его основе сведения о местоположении сервиса и его интерфейсах. Вот так выглядит фрагмент WSDL-файла, содержащий эти сведения:

[an error occurred while processing this directive]
port name = ”Temperature.ctemperaturePort” binding = ”tns:
  Temperature.ctemperaturebinding”;

soap: address location = ”http:
  //sal006.salnetwork.com:82/bin/converter.cgi"

После этого свойства Service и Port можно будет выбрать из выпадающих списков.

Заметим, что в ряде случаев можно не использовать WSDL-описание, а просто указать URL Web-сервиса в свойстве URL и ввести свойства Service и Port вручную.

Следующим шагом будет создание пользовательского интерфейса нашего клиентского приложения. Он несложен: поле для ввода исходного значения, метка для вывода результатов и кнопка, нажатие на которую инициирует обращение к Web-сервису.

Обработчик события, связанного с нажатием на кнопку, содержит код для обращения к Web-сервису. Он имеет вид:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := ' Degrees Fahrenheit is equal to ' +
    FloatToStr((HTTPRIO1 as
      Temperature_ctemperaturePortType).FahrenheitToCelsius(StrToFloat(Edit1.Text)))
    + ' Degrees Celsius';
end;

Теперь можно сохранить проект, скомпилировать приложение и протестировать его.

Итак, мы научились создавать приложения, использующие Web-сервисы. В следующем разделе данной статьи мы рассмотрим, как создавать сами Web-сервисы.

Создание Web-сервиса

Создать простейший Web-сервис (наподобие того, что мы использовали) с помощью Delphi 6 ненамного труднее, чем создать клиентское приложение. Дабы излишне не усложнять задачу, в качестве примера создадим очень примитивный Web-сервис, который просто умножает два числа. Для тестирования Web-сервиса следует иметь Web-сервер с доступным каталогом для размещения исполняемых фалов (и, естественно, работающий под управлением Windows). Для этого нужно выбрать со страницы Web Services репозитария объектов пиктограмму Soap Server Application и выбрать тип Web-приложения, которое мы планируем создать. Тип Web-приложения зависит от того, каким Web-сервером мы планируем пользоваться и желаем ли выполнять наш Web-сервис в адресном пространстве Web-сервера. Если это так, то нужно создать его в виде библиотеки, а если нет, то в виде исполняемого файла (в нашем примере мы выберем эту опцию).

Выбрав тип приложения, мы получим объект TWebModule, содержащий три компонента:

  • THTTPSoapDispatcher, отвечающий за получение запросов с помощью протокола SOAP;
  • THTTPSoapPascalInvoker, отвечающий за превращение этих запросов в вызовы методов объектов нашего приложения;
  • TWSDLHTMLPublish, отвечающий за генерацию WSDL-файлов, содержащих описание реализованных в Web-сервисе интерфейсов, предназначенное для разработчиков клиентских приложений для данного Web-сервиса.

Теперь можно приступить к созданию описания интерфейса Web-сервиса. Для этого просто создадим новый модуль и в нем опишем интерфейс IMult, содержащий единственный метод Multiply:

unit ws2;

interface

uses
  InvokeRegistry;
type
  IMult = interface(IInvokable)
    ['{8823BB66-C67C-483B-B985-529992F5F1F9}']
    function Multiply(Num1: LongInt; Num2: LongInt): Longint; stdcall;
  end;

implementation

initialization
  InvRegistry.RegisterInterface(TypeInfo(IMult));
end.

Значение GUID для данного сервера можно сгенерировать в редакторе кода с помощью комбинации клавиш Ctrl-Shift-G.

И наконец, нам следует создать модуль с реализацией метода Multiply:

unit ws3;

interface
uses
  InvokeRegistry, Ws2;

type
  TMult = class(TInvokableClass, IMult)
    function Multiply(Num1: LongInt; Num2: LongInt): Longint; stdcall;
  end;

implementation

function TMult.Multiply(Num1: LongInt; Num2: LongInt): Longint;
begin
  Result := Num1 * Num2;
end;

initialization
  InvRegistry.RegisterInvokableClass(TMult);
end.

Сохранив и скомпилировав проект, скопируем полученное приложение в каталог Web-сервера, предназначенный для хранения исполняемых файлов (в случае если используются Internet Information Services в Windows 2000, соответствующим каталогом по умолчанию будет C:\Inetpub\Scripts).

Если теперь обратиться из Web-браузера к Web-сервису с параметром /wsdl — http://MAINDESK/scripts/ws.exe/wsdl, получим список реализуемых им интерфейсов. Один из них, IMult, создан нами, другой, IWSDLPublish, реализован в компоненте TWSDLHTMLPublish.

Щелкнув по ссылке, указывающей на интерфейс IMult, можно получить WSDL-описание нашего интерфейса IMult, которое используется клиентским приложением и потому помещается в доступное место в Internet. В нашем же случае мы просто сохраним его в файле.

Осталось протестировать наш Web-сервис. Сделать это можно разными способами, например обратиться к нему с Web-страницы, содержащей код на одном из скриптовых языков. Однако мы напишем клиентское приложение на Delphi, коль скоро мы уже умеем это делать. Как и в первой части данной статьи, создадим новый проект, выберем со страницы Web Services репозитария объектов пиктограмму Web Services Importer и укажем в качестве параметра WSDL or XML Schema Location (Filename or URL) диалогового окна Web Services Import путь к WSDL-файлу, который мы только что сохранили. Затем сошлемся на сгенерированный интерфейсный модуль из модуля, связанного с главной формой клиентского приложения. Поместим на форму компонент THTTPRIO, укажем в качестве значения его свойства WSDLLocation имя того же WSDL-файла, выберем из выпадающих списков значения свойств Service и Port и создадим простейший пользовательский интерфейс приложения.

Обработчик события, связанного с нажатием на кнопку, имеет вид:

procedure TForm1.Button1Click(Sender: TObject);
var
  M: IMult;
begin
  M := HTTPRIO1 as IMult;
  Label1.Caption := '= ' +
    IntToStr(M.Multiply(StrToInt(Edit1.Text), StrToInt(Edit2.Text)));
end;

Запустив клиентское приложение, можем убедиться, что наш Web-сервис вполне работоспособен.

Итак, мы научились создавать свои Web-сервисы с помощью Delphi 6 и тестировать их.

Заключение

В настоящей статье мы рассмотрели создание с помощью Delphi 6 приложений, использующих Web-сервисы, а также создание самих Web-сервисов и убедились, что это не слишком сложно. В реальной жизни, наверное, не стоит создавать Web-сервис, перемножающий два числа, — существует много других, гораздо более интересных задач, решение которых стоит реализовать в виде Web-сервиса. Думается, они не заставят себя ждать.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay