Главная » Delphi » Технология создания клиента Web-службы

0

Помимо создания собственно Web-служб система Delphi предоставляет, конечно, и средства создания клиентов, обращающихся к таким службам. Создаются подобные клиенты весьма просто. Сформируем для начала новое приложение (обычную форму Windows Forms или форму ASP.NET Web).

Пример: подготовка описания интерфейса Web-службы

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

1.       Получить этот файл можно обращением:

http://localhost/WebServicel/WebServicel.asmx?wsdl

2.       Можно щелкнуть на ссылке Service Description в окне браузера, где мы отлаживали список методов Web-службы (рис. 6.16). В результате в браузере появится XML-текст описания интерфейса, который надо сохранить как WSDL-файл (его расширение должно быть .WSDL).

3.       Дадим команду Project > Add Web Reference (Проект > Добавить Web-ссылку) — откроется диалоговое окно так называемого UDDI-браузера Borland. Он позволяет просматривать UDDI-каталоги, хранящие коллекции Web- служб, и выбирать подходящую дистанционную услугу. Мы сейчас укажем WSDL-файл, сформированный в предыдущем примере в ходе создания тестовой Web-службы (рис. 6.19).

Рис. 6.19. Добавляем в проект описание Web-службы

Теперь нажмем кнопку Add Reference (Добавить ссылку), и описание выбранной нами Web-службы добавится к проекту. В частности, в папке проекта будет создан каталог WebReferences, а в нем разместится файл .WSDL.

С помощью команды Project > Add Web Reference в один проект может быть добавлено множество разных Web-служб (прокси-классов). Эта команда введена специально для быстрого создания многофункциональных приложений и систем, интегрирующих сторонние программы.

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

Просмотрев файл WebReference.WebService1.pas, мы увидим следующие строки.

type

[Sy s t em.Di agno sties.Debugge rS t epThroughAtt r i but e] [System.ComponentModel.DesignerCategoryAttribute(‘code’)] [System.Web.Services.WebServiceBindingAttribute (Name= ‘TWebServicelSoap’, Namespace=’http://tempuri.org/’)] TWebServicel = class

(System.Web.Services.Protocols. SoapHttpClientProtocol) III <remarks/> public

constructor Create; III <remarks/>

[System.Web.Services.Protocols.SoapDocumentMethodAttribute (‘http://tempuri.org/HelloWorld’, RequestNamespace=’http://tempuri.org/’,

ResponseNamespace= ‘http://tempuri.org/’, Use= System.Web. Services.Description.SoapBindingUse.Literal, ParameterStyle= System.Web.Services.Protocols. SoapParameterStyle.Wrapped)] function HelloWorld: string; III <remarks/>

function BeginHelloWorld(callback: System.AsyncCallback; asyncState: System.Object): System.IAsyncResult; III <remarks/>

function EndHelloWorld(asyncResult: System.IAsyncResult):

string;

III <remarks/>

[System.Web.Services.Protocols.SoapDocumentMethodAttribute (‘http://tempuri.org/WebMul’,

RequestNamespace=’http://tempuri.org/’, ResponseNamespace= ‘http://tempuri.org/’,

Use= System.Web.Services.Description.SoapBindingUse. Literal, ParameterStyle= System.Web.Services.Protocols. SoapParameterStyle.Wrapped)]

Puc. 6.21. Выбор описания Web-службы

function WebMul(x: System.Double; y: System.Double): System. Double ;

III <remarks/>

function BeginWebMul (x: System.Double; y: System. Doubles- callback : System. AsyncCallback;

asyncState: System.Object): System.IAsyncResult; III <remarks/>

function EndWebMul(asyncResult: System.IAsyncResult): System.Double; end;

Видно, что здесь описан класс TWebServicel, а в нем имеется метод WebMul.

Пример: организация доступа к Web-сервису из кода

Следующий шаг — программирование логики доступа к сервису и использование сервиса.

1.       Допустим, мы хотим обращаться к услуге WebMul по нажатию на кнопку Button"!. Для этого разместим на форме такую кнопку и создадим ее обработчик, а также разместим поле-надпись labell.

2.       В обработчике сначала создадим объект Web-службы (экземпляр класса TWebServicel), а затем обратимся к нужному нам методу WebMul.

procedure TWinForml.Buttonl_Click(sender: System.Obj ect; e: System.EventArgs); var

ws: TWebServicel; z: Doubles- begin

ws := TWebServicel.Create; // создаем прокси-объект z := ws.WebMul( 3.14, 2.8182 ); // вызываем метод удаленной Web-службы

label1.Text : = z.ToString; // выводим результат в текстовом виде end;

3.       Чтобы данный код компилировался, надо включить в перечень доступных модулей ссылку на описание прокси-класса. Сделать это можно, например, командой File > Use Unit (Файл > Использовать модуль), выбрав в диалоговом окне единственный модуль WebReference.WebServicel.

4.       Запустим программу, нажмем кнопку, и в поле надписи появится значение 8,849148. Удобнее, конечно, разместить на форме два поля ввода, чтобы реализовать, например, дистанционный клиент-калькулятор.

Пример: программирование выдачи сложных значений

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

1.       Допустим, мы хотим, чтобы значение, рассчитанное в методе WebMul, представляло собой не одно число, а передавалось в виде следующей записи.

TWebAnswer=record Res: Double; ResStr: String; end;

2.       Пусть поле Res будет хранить численное значение произведения, а ResStr — его текстовое представление. Последнюю величину можно, конечно, получить гораздо более простыми способами, поэтому данный пример приведен исключительно для демонстрации интеллектуальных возможностей Delphi. Перепишем метод WebMul в новый вид с названием WebAsk:

type

TWebAn s we г=record Res: Double; ResStr: String;

end;

TWebServicel = class(System.Web.Services.WebService) {$REGION ‘Designer Managed Code’} strict private III <summary>

III Required designer variable. Ill <1 summary> components: IContainer; III <summary>

III Required method for Designer support – do not modify III the contents of this method with the code editor. Ill <1 summary>

procedure InitializeComponent; {$ENDREGION} strict protected

III <summary>

III Clean up any resources being used. Ill <1 summary>

procedure Dispose(disposing: boolean); ovetride; private

{ Private Declarations } public

constructor Create;

II  Sample Web Service Method [WebMethod]

function HelloWorld: string; [WebMethod]

function WebAsk(x,y: Double): TWebAnswer; end;

Реализация его может быть такой.

function TWebServicel.WebAsk(х,у: Double): TWebAnswer;

var n: TWebAnswer;

begin

n.Res := x*y;

n.ResStr := n.Res.ToString; Result := n; end;

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

function WebAsk(x: System.Double; у: System.Double): TWebAnswer;

III      <remarks/>

function BeginWebAsk(x: System.Double; y: System.Doubles- callback: System.AsyncCallback;

asyncState: System.Object): System.IAsyncResult; III <remarks/>

function EndWebAsk(asyncResult: System.IAsyncResult): TWebAnswer;

4.       Нужный нам метод WebAsk описан как возвращающий значение типа TWebAnswer. Просмотрев текущий файл, мы найдем его описание.

[System.Xml.Serialization.XmlTypeAttribute (Namespace= ‘http://tempuri.org/’)] TWebAnswer = class III <remarks/>

public

Res: System.Double; III <remarks/> ResStr: string; end;

Этот тип представлен не как структура, запись Паскаля (record), а как класс — это относится ко всем схемам обмена данными между Web-служ- бами. Любые сложные структуры данных представляются в WSDL-опи- саниях в виде классов.

5. В классе TWebAnswer видны два наших поля — Res и ResStr. Как к нему обратиться? Так же, как и в предыдущем примере, созданием экземпляра нужного класса. А объект типа TWebAnswer будет сформирован автоматически.

var

ws: TWebServicel; z: TWebAnswer; begin

ws := TWebServicel.Create; z := ws.WebAsk( 3.14, 2.8182 ); labell.Text := z.ToString; end;

Пример: обращение к реальным Web-службам

В заключение рассмотрим еще один пример. В Сети существует международная служба погоды Global Weather, показания которой поставляются, в частности, в виде Web-службы. Получить ее WSDL-описание можно обращением к такому Web-адресу.

http://www.webservicex.com/globalweather.asmx?WSDL

1.       Сохраним WSDL-файл на локальном диске, откроем пустое приложение, дадим команду Project > Add Web Reference (Проект > Добавить веб-ссылку) и выберем этот файл. Система Delphi сгенерирует новый файл проекта, в котором на языке Delphi будет храниться описание соответствующего прокси-класса.

2.       Просмотрев файл, обнаружим нужный нам класс, type

GlobalWeather = class(System.Web.Services.Protocols. SoapHttpClientProtocol) III <remarks/> public

constructor Create; III <remarks/>

[System.Web.Services.Protocols. SoapDocumentMethodAttribute (‘http://www.webserviceX.NET/GetWeather’, RequestNamespace= ‘http://www.webserviceX.NET’, ResponseNamespace=’http:// www.webserviceX.NET’, Use= System.Web.Services.Description. SoapBindingUse.Literal,

ParameterStyle= System.Web.Services.Protocols. SoapParameterStyle.Wrapped)]

function GetWeather(CityName: string; CountryName: string): string;

/// <remarks/>

function BeginGetWeather(CityName: string; CountryName: string; callback: System.AsyncCallback;

asyncState: System.Object): System.IAsyncResult; III <remarks/>

function EndGetWeather(asyncResult: System.IAsyncResult): string;

III <remarks/>

[System.Web.Services.Protocols. SoapDocumentMethodAttribute (‘http://www.webserviceX.NET/GetCitiesByCountry’, RequestNamespace= ‘http://www.webserviceX.NET’, ResponseName space=’http://www.webserviceX.NET’, Use=System.Web.Services. Description. SoapBindingUse.Literal, ParameterStyle= System. Web.Services.Protocols. SoapParameterStyle.Wrapped)]

function GetCitiesByCountry(CountryName: string): string; III <remarks/>

function BeginGetCitiesByCountry(CountryName: string; callback: System.AsyncCallback;

asyncState: System.Object): System.IAsyncResult; III <remarks/>

function EndGetCitiesByCountry(asyncResult: System. IAsyncResult): string; •nd;

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

function GetWeather(CityName: string; CountryName: string): string;

Ее первый параметр — это название города, для которого сообщается погода, а второй — название страны. По всей видимости, названия эти должны быть указаны на английском языке. Кроме того, список доступных городов для определенной страны можно получить с помощь метода:

function GetCitiesByCountry(CountryName: string): string;

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

var

ws: GlobalWeather; s: Strings- begin

ws := GlobalWeather.Create; s := ws.GetWeather(‘Moscow’, ‘Russia’);

Как показала проверка, такие параметры корректны, и Web-служба работает нормально. Правда, возвращаемое ею значение, видимо, для простоты, представляет собой не отдельный класс, как хотелось бы (например, с полями «температура», «влажность», «давление»), а одну непрерывную строку. Однако содержит она типичное XML-описание, которое можно разобрать «вручную», собственным программным кодом.

Разборку выражения можно упростить путем привлечения, например, стандартной библиотеки .NET Framework для разбора XML-документов, которая называется Sy- stem.Xml.

Вот один из ответов этой Web-службы:

<?xml version="l.О" encoding^utf-16"?> <CurrentWeather>

<Location>Moscow / Vnukovo , Russia (UUWW) 55-39N 037-16E </Location>

<Time>Jul 27, 2005 – 08:30 AM EDT / 2005.07.27 1230 UTC </Time>

<Wind> from the W (270 degrees) at 9 MPH (8 KT):0</Wind> <Visibility> greater than 7 mile(s):0</Visibility> <SkyConditions> mostly cloudy</SkyConditions> <Temperature> 69 F (21 C)</Temperature> <DewPoint> 62 F (17 C)</DewPoint> <RelativeHumidity> 77%</RelativeHumidity> <Pressure> 29.85 in. Hg (1011 hPa)</Pressure> <Status>Success</Status> </CurrentWeather>

Летняя дата (Pelphi 2006 вышла в декабре 2005 года) объясняется участием автора книги в тестировании Borland Delphi и доступом к ранним версиям (field tests) продукта еще в июле.

Бобровский С. И. Технологии Delphi 2006. Новые возможности. — СПб.: Питер, 2006. — 288 е.: ил.

По теме:

  • Комментарии