Надеюсь сборка прошла гладко =) теперь небольшой пример использования SOAP протокола =)

Для начала определимся с каким сервисом будем работать.  Для примера я предлагаю получить курс валюты на определённую дату от ЦентроБанка

Страничка сервиса и доступные методы и сам  wsdl файл

В QtCreator создаём новый проект на Ваше усмотрение.

В *.pro файле дописываем:

*.pro
LIBS += -LC:/Projects/kdsoap/lib -lkdsoapd1 QT += network core INCLUDEPATH += C:/Projects/kdsoap/include

Скачиваем wsdl файл и кидаем его в корень директории своего проекта, у меня файл назван DailyInfo.wsdl

Дальше нужно сгенерировать классы для работы с soap из wsdl файла, для этого служит утилита kdwsdl2cpp.exe из каталога C:\Projects\kdsoap\bin

Открываем консольку и переходим в  корневую папку проекта (у меня C:\Projects\1CTerminal\1CTerminal\)
и генерируем файлы:

cd C:\Projects\1CTerminal\1CTerminal\
C:\Projects\kdsoap\bin\kdwsdl2cpp.exe  -o dailyinfo.h dailyinfo.wsdl
C:\Projects\kdsoap\bin\kdwsdl2cpp.exe -impl dailyinfo.h -o dailyinfo.cpp dailyinfo.wsdl
[tip] Скорее всего понадобиться добавить пути  в Path:
set PATH=C:\Qt\Qt5.2.1\5.2.1\mingw48_32\bin;%PATH%
[/tip]

dailyinfo.h — сгенерированный заголовочный файл для работы с dailyinfo.wsdl
и соответственно dailyinfo.cpp — реализация.
Не забудьте — при изменение wsdl файла описания сервиса нужно заново пересобирать эти классы!

[tip] Можно сделать автогенерацию классов при компиляции, для этого в *.pro файле:

KDWSDL = dailyinfo.wsdl 
WSDL_DIR = generated //-- Путь, куда складывать сгенерированные файлы
KDSOAPDIR = C:\Projects\kdsoap
include(kdsoap.pri)

А также в корень проекта кинуть сам kdsoap.pri из папки с kdsoap.
Также тогда потребуется убрать добавление библиотеки из  LIBS  и INCLUDEPATH
Кстати, так же нужно будет сгенерить дебажную и релизную версии kdsoap
Ну и проверить в kdsoap.pri правильно ли называются сами библиотеки.
[/tip]

Работа KDSoap основана на механизме сигнал-слотов.

Нас интересует пока что метод GetCursOnDate (описание методов тут или тут)

Открываем dailyinfo.h  и в самом начале видим основное пространство имён (DailyInfo) а так же основной класс (DailyInfoSoap12), через который мы будем вызывать методы сервиса.
Сигналы обычно именуются следующим образом:

об успешном выполнении getCursOnDateDone
об ошибке: getCursOnDateError.
Что бы узнать какие нужны параметры для вызова метода ищем поиском объявление функции «getCursOnDate(«.

В данном случае параметром будет  const TNS__GetCursOnDate& parameters,
аналогично ищем для сигналов getCursOnDateDone  и getCursOnDateError.
Кстати, QtCreator сам подскажет какие, если что 😉

Создадим вспомогательный класс, например  SoapClient, наследуемся от QObject.

soapclient.h
#ifndef SOAPCLIENT_H #define SOAPCLIENT_H #include <QObject> #include <QDebug> //-- Подключаем сгенерированный класс. //-- Если Вы классы для wsdl генерируете из qmake, то называться будет wsdl_dailyinfo.h #include "wsdl_DailyInfo.h" using namespace DailyInfo; class SoapClient : public QObject { Q_OBJECT public: explicit SoapClient(QObject *parent = 0); signals: public slots: private slots: void onGetCursOnDateDone(const TNS__GetCursOnDateResponse& parameters); //-- успешное выполнение метода, принимаем результат void onGetCursOnDateError(const KDSoapMessage& fault); //-- Ошибка private: DailyInfoSoap * dailyInfo; }; #endif // SOAPCLIENT_H

Реализаци

soapclient.cpp
#include "soapclient.h" SoapClient::SoapClient(QObject *parent) : QObject(parent) { dailyInfo = new DailyInfoSoap(this); //-- Новый объект для работы с сервисом dailyInfo->setEndPoint(QLatin1String("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx")); //-- Адрес сервиса dailyInfo->setSoapVersion(KDSoapClientInterface::SOAP1_2); //-- Протокол //-- Коннектим сигналы со слотами connect(dailyInfo, &DailyInfoSoap::getCursOnDateError, this, &SoapClient::onGetCursOnDateError); connect(dailyInfo, &DailyInfoSoap::getCursOnDateDone, this, &SoapClient::onGetCursOnDateDone); //-- Парметры для вызова метода GetCursOnDate TNS__GetCursOnDate params; KDDateTime data = KDDateTime::currentDateTime(); //-- не долго мучаясь поставим текущую params.setOn_date(data); dailyInfo->asyncGetCursOnDate(params); } void SoapClient::onGetCursOnDateDone(const TNS__GetCursOnDateResponse& parameters) { qDebug()<<"Done!!!"; TNS__GetCursOnDateResult res= parameters.getCursOnDateResult(); qDebug()<<res.any().toXml(); //-- Из вывода узнаём как нам путешествовать, что бы найти необходимые данные KDSoapValue diffgram=res.any(); KDSoapValue valuteData=res.any().childValues().at(0); KDSoapValue usaDollar= valuteData.childValues().at(10); QList<KDSoapValue> atributes= usaDollar.childValues().attributes(); qDebug()<<"id"<<atributes.at(0).value().toString(); qDebug()<<"rowOrder"<<atributes.at(1).value().toString(); qDebug()<<"Vname"<<usaDollar.childValues().at(0).value().toString(); qDebug()<<"Vnom"<<usaDollar.childValues().at(1).value().toString(); qDebug()<<"Vcurs"<<usaDollar.childValues().at(2).value().toString(); qDebug()<<"Vcode"<<usaDollar.childValues().at(3).value().toString(); qDebug()<<"VchCode"<<usaDollar.childValues().at(4).value().toString(); qDebug()<<"Статья написана pavelk.ru, надеюсь было понятно=)"; } void SoapClient::onGetCursOnDateError(const KDSoapMessage& fault) { qDebug()<<"Error!"; }

Дальше в main.cpp не забудем подключить и создать класс:

main.cpp
#include "soapclient.h" SoapClient * client = new SoapClient(0);

Запускаем и смотрим вывод =)

Надеюсь всё заработало и стало теперь понятно как написать SOAP клиент на Qt5.

Leave a Comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

You may also like