Надеюсь сборка прошла гладко =) теперь небольшой пример использования SOAP протокола =)
Для начала определимся с каким сервисом будем работать. Для примера я предлагаю получить курс валюты на определённую дату от ЦентроБанка
Страничка сервиса и доступные методы и сам wsdl файл
В QtCreator создаём новый проект на Ваше усмотрение.
В *.pro файле дописываем:
*.proLIBS += -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 файла описания сервиса нужно заново пересобирать эти классы!
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.