В предыдущем материале мы рассмотрели, как можно обращаться к WEB-сервисам из DIRECTUM на примере простого сервиса склонения «Морфер». Рассмотрим более сложный пример, в котором обратимся к WEB-сервису Центрального банка Российской Федерации.
Описание доступных методов можно посмотреть по адресу: http://www.cbr.ru/dailyinfowebserv/dailyinfo.asmx.
Описание самого WEB-сервиса находится по адресу: http://www.cbr.ru/dailyinfowebserv/dailyinfo.asmx?WSDL.
Возьмем для примера метод:
Пример работы с данным WEB-сервисом:
WSDLFileName = "http://www.cbr.ru/dailyinfowebserv/dailyinfo.asmx?WSDL"
// Инициализация подключения к сервису
SoapClient = CreateObject("MSSOAP.SoapClient30")
SoapClient.MSSoapInit(WSDLFileName)
Rez = SoapClient.GetCursOnDateXML(Сейчас())
Окно(Rez)
В результате получим следующее сообщение:
Как видно результат нам ничего не дал, что вполне ожидаемо, т.к. результат должен быть XMLDocument.
Разобраться в ситуации нам поможет Microsoft SOAP Toolkit 3.0, который можно бесплатно скачать с сайта Microsoft по адресу: http://www.microsoft.com/downloads/en/details.aspx?FamilyId=C943C0DD-CEEC-4088-9753-86F052EC8450&displaylang=en
SOAP Toolkit включает в себя следующие части:
Для того, чтобы разобраться с ответом, который пришел от WEB-сервиса воспользуемся утилитой для трассировки SOAP-вызовов MsSoapT3.exe. Подключим утилиту для анализа ответа WEB-сервиса:
где Destination host = HostName, а Destination port = Port. После чего жмем «ОК».
6. Модифицируем наш пример и приведем его к следующему виду:
WSDLFileName = "D:\Temp\dailyinfo.wsdl"
// Инициализация подключения к сервису
SoapClient = CreateObject("MSSOAP.SoapClient30")
SoapClient.MSSoapInit(WSDLFileName)
Rez = SoapClient.GetCursOnDateXML(Сейчас())
Окно(Rez)
7. Запускаем сценарий и в окне MsSoapT наблюдаем следующую картину:
В правом верхнем окне мы видим запрос, который мы отправили WEB-сервису, а в правом нижнем окне ответ, полученный от сервиса. Теперь разобраться с ответом не составит труда. Например, вот так:
WSDLFileName = "D:\Temp\dailyinfo.wsdl"
// Инициализация подключения к сервису
SoapClient = CreateObject("MSSOAP.SoapClient30")
SoapClient.MSSoapInit(WSDLFileName)
Rez = SoapClient.GetCursOnDateXML(Сейчас())
// Получим дату курсов валют
ValuteData = Rez.Item(0)
OnDate = ValuteData.Attributes.getNamedItem("OnDate").Value
Year = Copy(OnDate;1;4)
Month = Copy(OnDate;5;2)
Day = Copy(OnDate;7;2)
Data = Format("%s.%s.%s";ArrayOf(Day;Month;Year))
Str = "Курсы валют на "&Data&" составляют:"&CR
// Получим дочерние элементы
ChildNodes = ValuteData.childNodes
// Количество дочерних элементов
ChildNodesCount = ChildNodes.Length
Count = 0
// переберем все дочерние элементы и сформируем результирующую строку
while Count < ChildNodesCount
Node = ChildNodes.Item(Count)
NodeCurs = Node.childNodes
NodeCursCount = NodeCurs.Length
ChildCount = 0
Str2 = ""
while ChildCount < NodeCursCount
if NodeCurs.Item(ChildCount).nodeName == 'Vname'
Vname = Trim(NodeCurs.Item(ChildCount).Text)
endif
if NodeCurs.Item(ChildCount).nodeName == 'Vnom'
Vnom = NodeCurs.Item(ChildCount).Text
endif
if NodeCurs.Item(ChildCount).nodeName == 'Vcurs'
Vcurs = NodeCurs.Item(ChildCount).Text
endif
if NodeCurs.Item(ChildCount).nodeName == 'VchCode'
VchCode = NodeCurs.Item(ChildCount).Text
endif
ChildCount = ChildCount + 1
endwhile
Str2 = Format("%s: %s руб = %s %s";ArrayOf(Vname; Vcurs; Vnom; VchCode))
Str = Str & Str2 & CR
Count = Count + 1
endwhile
ShowMessage(Str)
В результате получаем следующее:
Эх, все таки MSSOAP классная штука. С некоторыми ограничениями на стандарты WS-*, но все же. Как жаль что MS больше его не поддерживает. И достойного аналога не предоставляет.
А как же WCF?
Теперь понял, спасибо.
В одном из блогов Наталия Ефимцева писала об интероперабельности WCF. Я попытался поднять тему MS SOAP. Похоже что вразумительного ответа на вопрос "Что использовать вместо MSSOAP?" в MS не знают (или же просто об этом не особо задумывались).
Либо же тренд как раз на предметную ориентированность и кодогенерацию. Если написал сервис и хочешь его поддерживать из приложений через COM, то делай этот самый клиентский COM, например на С++ (вроде бы были средства для кодогенерации проксиков и тут).
Забыл ссыль на этот самый блог
Добрый день!
В статье видимо текст ссылок не вставился, поэтому поясню, что для трассировки необходимо в файле dailyinfo.wsdl заменить строчки :
на
и строку
на
Добрый день!
В статье видимо текст ссылок не вставился, поэтому поясню, что для трассировки необходимо в файле dailyinfo.wsdl заменить строчки :
на
и строку
на
Илья, все верно. К сожалению в комментариях строки, содержащие xml, тоже не отображаются.
Извиняюсь, не получилось вставить.
В статье видимо текст ссылок не вставился, поэтому поясню, что для трассировки необходимо в файле dailyinfo.wsdl заменить строчки :
soap:address location="http://cbr.ru/dailyinfowebserv/dailyinfo.asmx"
на
soap:address location="http://localhost:8080/dailyinfowebserv/dailyinfo.asmx"
и строку
soap12:address location="http://cbr.ru/dailyinfowebserv/dailyinfo.asmx"
на
soap12:address location="http://localhost:8080/dailyinfowebserv/dailyinfo.asmx"
Попробовал первый пример получил ошибку :
Что я делаю не так?
Крашится на строке:
SoapClient.MSSoapInit(WSDLFileName)
Я вам в первой статье еще ответил, что нужно установить Microsoft SOAP Toolkit 3.0.
Дмитрий, может подскажите как передать xml файл через SOAP, а то никак не могу с этим разобраться на сервисе http://npchk.nalog.ru/
Обычно, для этих целей, я использую способ описанный в примере 3-ей статьи: DIRECTUM и WEB-сервисы (часть 3)
Авторизуйтесь, чтобы написать комментарий