YOUROOT - Программирование - Простой SOAP сервис


Краткое предисловие

При написании данного материала самым тяжелым делом оказалось найти подходящий публичный SOAP сервис. Я работал с SOAP в закрытых сетях, либо с SOAP сервисами в публичном интернете, которые требовали авторизации.
К счастью, есть рабочий и адекватно созданный SOAP сервис Центробанка для получения курсов валют и прочей информации.
Сервис расположен по адресу http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx.
При переходе по ссылке Вы увидите следующее:
Сервис ЦРБ
При клике на ссылку "описание службы" можно посмотреть определение WSDL:
Сервис ЦРБ

Рекомендую предварительно протестировать сервис ЦРБ при помощи бесплатной утилиты SoapUI. Эта утилита удобна, но требует много ресурсов ЦП и памяти (написана не на c++).
В SoapUI создаем новый проект:
SOAPProject
Указываем имя проекта и WSDL:
SOAPProject
После создания проекта мы увидим два списка операций сервиса (для SOAP 1.1 и SOAP 1.2):
SOAPProject
Откроем запрос для операции GetCursOnDate:
SOAPProject
В запросе происвоим значение параметру On_date и выполним запрос:
SOAPProject
Аналогично можно протестировать другие операции сервиса.

Создание SOAP приложения в C++ Builder

Создаем обычное VCL приложение:
BuilderProject
BuilderProject
Переименуем проект:
BuilderProject BuilderProject
Сохраним проект в удобной для нас папке:
BuilderProject BuilderProject
BuilderProject
Импортируем WSDL в наш проект, в результате в проекте появится дополнительный модуль:
BuilderProject BuilderProject BuilderProject BuilderProject BuilderProject
В созданном модуле DailyInfo нас будет интересовать прежде всего (в конце DailyInfo.h) функция GetDailyInfoSoap, создающая объект _di_DailyInfoSoap, с которым мы в дальнейшем будем работать, а также метод GetCursOnDate:
BuilderProject
Теперь подготовим модуль Unit1 для работы с сервисом SOAP
В Unit1.h добавим ссылку #include "DailyInfo.h" и определение _di_DailyInfoSoap ps;, после чего проект должен компилироваться: BuilderProject
Размещаем на форме компоненты TMemo *Memo1; TMemo *Memo2; TButton *Button1; THTTPRIO *HTTPRIO1; TXMLDocument *XMLDocument1; TEdit *Edit1; TEdit *Edit2; TEdit *Edit3; TDateTimePicker *DateTimePicker1:
BuilderProject
У формы создадим обработчик события OnShow:
BuilderProject
У HTTPRIO1 создадим обработчики событий:
BuilderProject
Создадим обработчики событий у кнопки:
BuilderProject
Теперь можно скомпилировать проект и увидеть, что наше приложение работает:
BuilderProject
В приложении можно указывать дату курса валют, видеть отправляемое SOAP сообщение и ответное SOAP сообщение сервиса.
К сожалению, разработчики сервиса ЦРБ сделали сервис так, что метод GetCursOnDate нам возвращает в доступном виде только схему данных. Для непосредственного доступа к данным курсов валют будем использовать метод GetCursOnDateXML, который возвращает объект, из которого можно извлечь сообщение с курсами валют.
Добавим в обработчик код для использования этого метода (в картинку плохо помещается, он в прилагаемом проекте) и скомпилируем проект:
BuilderProject

В данном материале не рассматриваются вопросы дизайна формы, работы с XML и другие вопросы. не относящиеся к теме.

Прилагаемые файлы

Прилагается один файл:

  • Архив проекта, включая исполняемый файл, который можно сразу запустить. CBR.zip Загрузить