Продолжая исследовать возможности применения команды 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… включительно.
Рисунок 1. Сообщение SOAP для службы |
Чтобы создать файл XML с сообщением SOAP, копируем в «Блокнот» все, начиная с xml… (см. рисунок 2).
Рисунок 2. Файл XML с сообщением SOAP |
Далее необходимо указать пять значений. В строке
Рисунок 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 …
Теперь необходимо выделить нужный фрагмент (величину платежа) из элемента
$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. Уверен, что и вы тоже, поэтому не пропустите мою следующую статью, посвященную прокси-веб-службам.