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