Продолжая исследовать возможности применения команды PowerShell Invoke-WebRequest для запросов к веб-службам, перейдем от нового протокола RESTful к более старому протоколу SOAP. Для примера запросим бесплатную общедоступную службу на базе SOAP, размещенную на www.webservice.net. На основе срока кредитования в годах, процентной ставки, общей суммы жилищного кредита, ежегодных налогов и страховки, веб-служба Mortgage Web Service (MWS) вычисляет и возвращает величину полного предполагаемого ежемесячного платежа.

На домашней странице MWS находим заголовок Endpoint, под которым указан универсальный код ресурса (URI) MWS:

http://www.webservicex.net/mortgage.asmx?WSDL

Отметим два момента. Во-первых, URI имеет расширение. asmx, которое почти всегда является расширением уникального кода ресурса SOAP. Во-вторых, отметим строку запроса? WDSL — ссылку на XML-ресурс, позволяющий этой веб-службе представить себя внешнему миру, необходимые входные данные и возвращаемый результат. Это пригодится нам в будущем, когда мы будем использовать то, что для простоты назовем «прокси веб-службой».

Под этим URI указано имя «метода» веб-службы — GetMortgagePayment. У MWS только один метод, однако есть и другие веб-службы, имеющие несколько методов. Щелкнув на GetMortgagePayment, мы открываем область с заголовком SOAP 1.1, где показано, как создать файл XML, передающий MWS необходимые данные.

На рисунке 1 сообщение SOAP, необходимое для MWS, приведено полностью, но мы не должны помещать в наш файл весь этот текст, так как PowerShell автоматически вставляет в него все до строки SOAPAction… включительно.

 

Сообщение SOAP для службы
Рисунок 1. Сообщение SOAP для службы

Чтобы создать файл XML с сообщением SOAP, копируем в «Блокнот» все, начиная с

 

Файл XML с сообщением SOAP
Рисунок 2. Файл XML с сообщением SOAP

Далее необходимо указать пять значений. В строке int вводим срок кредитования в годах. Здесь int — замещающий текст, подсказывающий, что этом месте вводится целое число. Исходя из того что срок кредитования составляет 30 лет, заменяем int на 30. В следующей строке, где вводится процентная ставка (элемент ), замещающий текст double указывает на то, что здесь должно быть число с плавающей точкой. Если ставка составляет 4,2%, пишем 4.2. Вводим сумму кредита 250 000 долл. и пропускаем налоги и страховку, полагая их равными 0. Сохраняем файл под именем Payments.XML. Результат показан на рисунке 3 (заметим, что в «Блокноте» длинная первая строка перенесена).

 

Заполненный файл сообщения
Рисунок 3. Заполненный файл сообщения

Отправку файла Payments.xml поручим команде Invoke-Webrequest и, учитывая, что запросы SOAP обычно предполагают отправку данных методом POST, а не GET, укажем ожидаемый вид возвращаемых данных (в данном случае текст и XML). Результат сохраним в переменную $Result:

$URI = " http://www.webservicex.net/mortgage.asmx? WSDL"
$result = (iwr $URI -infile payments.xml -contentType
   "text/xml" -method POST)

Службы SOAP возвращают данные в виде текста XML в стиле SOAP, содержащегося в переменной $Result. Содержимое возвращаемого текста XML в стиле SOAP выводим с помощью запроса

$result.content

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

1222.5429342838054

Теперь необходимо выделить нужный фрагмент (величину платежа) из элемента в структуре XML. Как мы уже делали ранее, воспользуемся для этого командой Select-XML. Для удобства поместим возвращаемый код XML в отдельную переменную:

$SOAP = $Result.Content

Для лучшей визуализации текста XML сохраним переменную $SOAP в файл и откроем его с помощью практически любого веб-браузера (кроме Edge, который на момент написания данной статьи не открывал файлы XML). В результате получим удобно скомпонованный текст, дающий точное представление о типе данных, предлагаемых службой. Чтобы выделить из этого текста элемент TotalPayment, построим запрос Xpath, как было описано в одной из предыдущих статей:

$xpathfilter = "//* [local-name ()='TotalPayment']"

Зафиксируем этот элемент с помощью Select-XML:

$Element = Select-XML -content $SOAP -xpath $xpathfilter

Введя имя переменной $Element, мы увидим три атрибута: node (содержит искомые данные), path и pattern. Введя $Element.node, увидим всего один атрибут, #text, содержащий интересующий нас размер платежа. Вмещаем эти действия в одну строку запроса, присоединив к нашей переменной. node и.'#text' (одинарные кавычки обязательны, так как, хотя запись #text понятна для XML, все, что идет после знака #, PowerShell воспринимает как комментарий):

$Payment = $Element.Node.'#text'

Только подумайте, если бы каждый умел пользоваться PowerShell и Invoke-Webrequest в период с 1999 по 2008 год, ипотечный кризис, возможно, просто не случился бы! Это прекрасно, но я в своей жизни мог бы обойтись без создания файлов XML. Уверен, что и вы тоже, поэтому не пропустите мою следующую статью, посвященную прокси-веб-службам.