В статье «Начинаем работу с веб-службами на базе SOAP и PowerShell», опубликованной в предыдущем номере, мы приступили к изучению работы с веб-службами на базе SOAP/XML с помощью средств PowerShell. Чтобы получить доступ к данным какой-либо службы SOAP, нам нужно было составить запрос в виде файла XML со структурой, отвечающей требованиям этой службы. С помощью команды Invoke-WebRequest методом POST (а не GET, как обычно) этот файл пересылался веб-службе, после чего из файла XML, возвращаемого веб-службой, с помощью Select-XML извлекались нужные данные.

Эта схема работает, но построение содержащих запрос файлов XML, отвечающих требованиям привередливых служб SOAP, едва ли может войти в первую десятку ваших любимых занятий. Поэтому разработчиками была предложена концепция посредника для запросов к веб-службам.

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

Например, WSDL-страницу калькулятора ипотечного платежа, который рассматривался в предыдущей статье, можно увидеть по ссылке http://www.webservicex.net/mortgage.asmx? wsdl. Текст неудобен для восприятия, но он предназначен не для нас с вами, а для вычислительных средств, например команды New-WebServiceProxy из состава PowerShell. Какие возможности открывает доступ к www.webservicex.net/mortgage.asmx, можно узнать с помощью трех команд:

-$URI="http://www.webservicex.net/
   mortgage.asmx? wsdl"
-$Proxy = New-WebserviceProxy $URI
   -Namespace X
-$Proxy | get-member -MemberType
   Method Get*

Здесь мы сначала помещаем унифицированный идентификатор (URI) страницы WSDL в переменную, после чего задействуем команду New-WebServiceProxy, которая считывает эту страницу WSDL и создает новый тип (точнее, класс) структуры данных PowerShell, работающий подобно объекту PowerShell. Он создает методы, соответствующие доступным для запросов данным веб-службы. Методы нового объекта $Proxy мы выводим на экран с помощью Get-Member, чтобы найти среди них метод вычисления интересующего нас размера выплаты по кредиту. Команда Get-Member предписывает выводить только методы (не свойства и не события), начинающиеся с Get. Почему Get? Дело в том, что в пространстве SOAP у большинства интерфейсов, используемых для извлечения данных или получения ответов, имена начинаются с Get, как у команд PowerShell.

Один из возвращаемых методов имеет многообещающее название — GetMortgagePayment. Мы уже знаем, что PowerShell позволяет получить информацию о любом методе, для чего достаточно ввести имя этого метода без скобок:

$Proxy.GetMortgagePayment

В ответ на этот запрос получаем результат, показанный на экране 1.

 

Информация о методе
Экран 1. Информация о методе

Описание, оканчивающееся записью GetMortgagePayment (int Years…), дает вполне четкое представление о том, как следует вызывать этот метод. Следуя данной схеме, укажем срок кредитования, процентную ставку, сумму кредита и пр., как показано на экране 2.

 

Вызов метода
Экран 2. Вызов метода

Итак, для получения результата мы смогли обойтись без манипуляций с XML. Узнать размер ежемесячного платежа позволяет однострочный запрос:

$Payment = $Proxy.GetMortgagePayment (30,4.2,250000,0,0)

Те, кого интересует доступ к какой-либо веб-службе SOAP средствами PowerShell, непременно оценят по достоинству New-WebServiceProxy. Чтобы еще раз опробовать схему получения четких данных от общедоступной веб-службы SOAP, проделайте то же самое с http://www.webservicex.net/uszip.asmx?wsdl. При вводе территориального кода, названия штата или почтового индекса эта служба выдает каждый город данной группы с указанием названия города, штата, почтового индекса (индексов), территориального кода и часовой зоны.

Итак, посредники для запросов к веб-службам — ключ к данным служб SOAP. Однако, прежде чем закрыть тему, хочу дать несколько советов.

Во-первых, убедитесь, что веб-служба производит актуальные данные. Мне встречалось множество на первый взгляд превосходных веб-служб, дающих явно неверные астрономические, метеорологические или экономические сведения, и, хотя они продолжают работать, их уже давно никто не принимает во внимание, и они производят информационный мусор. Например, веб-служба, которая только что упоминалась, похоже, не в курсе, что у города Линчберг (шт. Вирджиния) в 2001 году территориальный код сменился с 804 на 434. Дело в том, что сейчас появляется очень мало новых служб SOAP, а старые постепенно исчезают.

Во-вторых, если вам точно не известен уникальный идентификатор URI страницы WSDL, возьмите URI самой веб-службы (в нашем случае www.webservicex.net/uszip.asmx) и добавьте? wsdl, в результате чего получится http://www.webservicex.net/uszip.asmx?wsdl.

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