Russian Qt Forum
Ноябрь 21, 2019, 12:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: WSDL, SOAP, Web-Services + Qt (обзор, обсуждение, сбор ссылок)  (Прочитано 22098 раз)
Denjs
Гость
« : Январь 29, 2011, 17:06 »

В данном топике попробую собрать актуальную информацию по вопросам связки C++/Qt и веб-сервисов.
Т.е. все что актуально на 2011, январь, 30. 2011, февраль, 17.

резюме:
пакетлицензияРабота с WSDLклассы, ООП?Совместимость с MinGWЕсть примеры для Qt?ОС
_____________________________________________________________________________________________________________________________________________
QtSOAPLGPL(?) - Qtда (?)даWin|Lin| +(?)
Axis2/CApache 2.0да STL, функции - (возможно исправили?) - Win|Lin| +(?)
WSF StaffApache 2.0да STL да даWin|Lin| +(?)
gSoapGPL, LGPL, коммерч.да STL, функции, +(?) да даWin|Lin|Symbian|S60 +(?)
KdSoapкоммерч., GPLдаQt, +(?) н/д - Win|Lin| +(?)
FEASTкоммерч. да (?) Qt, +(?) н/д н/д (вероятно есть) Win|Lin| +(?)


QtSOAP
(лицензия: LGPL (?))

*QtSOAP. Значит первое что хочу отметить, что это решение  перемещено троллями в "архив решений" (качать вроде как с http://qt.gitorious.org/qt-solutions ). не знаю почему, но у меня возникает впечатление что развиваться оно не будет. Впрочем оно и по возможностям весьма специфично-ограниченно - не умеет генерировать код и не умеет сама анализировать WSDL (был бы интерфейс как у php-soap - с вызовом функций сервиса по именам и возможностью просмотреть структуры данных - меня бы устроило и без генерации кода).В итоге - чтобы начать пользоваться веб-сервисом, вам надо вручную сначала изучить wsdl-файл. Ну и "SOAP 1.1 только".
* доки
* Описание того как  это пользовать. раз, два.
* описание "как ставить": http://stackoverflow.com/questions/1290198/qt-soap-install

:: не игрался. разбирать WSDL-файл руками мне пока квалификация не дозволяет... впрочем не хочу и не буду 8-) ...


Axis2/C
(лицензия: Apache 2.0)

* Axis2/C ( ссылка ). Апачевские компоненты. Много всего вкусного, генерация кода, wsdl и бла-бла-бла. Но почему-то генерация "только С" (не С++) (по крайней мере у мена не получилось). С-шный код какой-то мутный... и все равно требует (по крайней мере для генерации кода) оргигинальный Axais2 работающий на Java (ну и её тоже соответсвенно).

Есть трудности/проблемы под выньдой. Axais2/С "под винду" ориентирван тем боком, что ориентирован на сборку со "студией" от небезизвестного граблепроизводителя. ну и бинарники тоже собранны в оной. В итоге, если вы кодите на MinGW - то у вас появляются проблемы с подключением этих библиотек к своему проекту. Как вариант решения - я вижу генерацию .def и .a файлов так-же как это делается с библиотекой MySQL под виндоус (тоже собранной под студией) ( "reimp -d libmysql.lib" и "dlltool -k -d libmysql.def -l libmysql.a" )
(см в ассистант раздел "How to Build the QMYSQL Plugin on Windows"). не проверял, но полагаю тут аналогичный путь решения.

::У меня не вышло связать это с Qt-проектом. В своё время я не решил проблему подключения библиотек собранных в студии к проекту собираемому с mingw, а потом уж не надо было....


WSF Staff
(лицензия: Apache 2.0 (без каких либо GPL - подлицензии в отдельном разделе).)

* WSF Staff ( ссылка )
WSF Staff - это обертка для Axis2/C, т.е. для функционирования требуются библиотеки Axis2/C. Для функционирования Сервера необходим весь Axis2/C, для клиентской части, собственно, небольшое количество небольших библиотек (не более 4-5)

Вкусно! не совсем Qt, но C++ и STL. Судя по по описаниям - _удобная_ _человечья_ обертка над Апачевским Axis2/C.

Может генерить WSDL из .h-файла и наоборот. Генерит обертки как для клиента так и для сервиса. Код С++. Сомтрите сами:
* Creating a C++ service under Linux
* Создание СОА клиентов на основе WSDL описания.
* SoaApplicationStruct

Проект живой (последние обновления февраль 2011 года) Часть доков по русски.
Выглядит вкусно, как и доки в wiki от нокии (см ниже).

Связка с Qt и MinGW:
 см пост от разработчиков ниже по топику(быстро решили, молодцы!)
- т.е. оно вполне себе собирается с Qt и MinGW и использует STL-ные классы:
* ман на офф.сайте: Создание клиента StockQuote использующего Qt

::лично я пока не использовал. но с разработчиками есть контакт, проект, имхо, интересен, и думаю как разгребусь немного - поиграюсь.


gSoap
(лицензия: разные части под разными лицензиями или мультилицензированием - GPL|LGPL|Коммерческая)

В Wiki от Нокии появилась заметка про то как использовать gSoap и Qt. :
* GSoap: SOAP and XML Web services for Qt apps.
* Есть статья про "Using gsoap for web services".
Да, "не шибко родное" (в смысле "не интегрированное в Qt"), да, но зато типа "почти официальная инфа" от нокии, да ещё и с примерами кода).

* может генерить WSDL из .h-файла и наоборот.
* при указании генерить С++-ный код, использует STL-ные типы : std::string, std::vector...

Первая из указанных статей, кстати вроде как появилась "буквально неделю назад" - 19 января (очень похоже, что это ещё один признак того, что QtSoap будут постепенно "закапывать", особенно если рецепты будут работать под Win/Lin)... кто знает, может наличие механизмов для связки с Qt в стандартном проекте, нацеленном на веб-сервисы, лучше чем наличие "родной", но самостоятельной компоненты)...

* По теме всплывает ещё Nokia WSDL-to-C++ Wizard for S60 который хочет "XML Data Binding Library" для исполнения данного кода... а последняя кажется токмо для s60 и существует...

Связка с Qt и MinGW:
:: не без заковырк и напильника, но собрался простой веб-сервис-клиент c помощью Qt и gSoap под Windows. Файлы см в посте ниже
:: есть трудность с использованием русских имен в полях данных и именах функций в WSDL. Подозреваю, что в итоге подключить его например к веб-сервисам на базе 1С без переименования имен функций и полей веб-сервиса на английский может быть затруднительно. (пост). С 1С начал играться, но пока не закончил.

Но в целом впечатление от gSoap у меня хорошие.


KdSoap
(лицензия: GPL|собственная коммерческая)

* KdSoap. http://www.kdab.com/products/kd-soap

Связка с Qt и MinGW:
Заявлена родная поддержка Qt. Но цены совсем не для частного разработчика. около 490-700 € за одну лицензию.
Однако тут: утверждается что "KDSoap is available under the GPL license from ftp://ftp.kdab.com/pub/kdsoap (for opensource applications and for evaluation purposes), and under a commercial license from http://www.kdab.com/products/license-prices"

::Увы, я пока не пробовал это. Нашел это 2 дня назад только. Кто будет играться - доложитесь о результатах?


FEAST
(лицензия: собственная проприетарная коммерческая)

Вебсервисы для Qt. Подробнее - только статья на сайте и рекламные листовки.
http://www.clausmark.com/index.php/feast/articles/webservices-with-qt.html


что может быть ещё полезно:
* SOAP Версия 1.2 Часть 0: Учебник для начинающих
 

_____________________
За сим пока все.
Надеюсь вы будете пополнять топик ссылками и примерами использования Qt и ВебСервисов.
« Последнее редактирование: Февраль 17, 2011, 17:58 от Denjs » Записан
Denjs
Гость
« Ответ #1 : Январь 31, 2011, 16:21 »

Работающий пример веб-сервис-клиента на Qt созданного с gSoap
Проверено правда только на виндоус.
компилятор - MinGW


По мотивам статьи от Нокии указанной выше ( GSoap: SOAP and XML Web services for Qt apps.  ) - следал все как сказано в статье но на нстольном компе под виндоус. Результат - в приложении к посту.

Да, перед сборкой и анализом примера - надо бы прочитать статью.
Иначе будет не понятно откуда там половина файлов взялась.



Перед сборкой надо качать GSoap -> http://sourceforge.net/projects/gsoap2/files/gSOAP/ я качал gsoap_2.8.1.zip.
его я распаковал в С:/ws/ -> так что бы скажем LICENSE.txt был тут: C:\ws\gsoap-2.8\LICENSE.txt
После этого - уже собранные утилиты автогенерации кода и разбора WSDL лежат в C:\ws\gsoap-2.8\gsoap\bin\win32

Важно: этот путь ( C:\ws\gsoap-2.8 ) указан в файле проекта!
если будете разворачивать gsoap в другое место - отредактируйте .pro файл!




Все. Скачиваете демо проект и собираете.

Автогененируемые gsoap файлы лежат в подкаталоге проекта в папке gsoap.
Что там, откуда взялось, что такое именно StockQuote.wsdl - написано собственно в самой статье от Нокии, упомянутой выше.

===========================================
UPD 2011.04.07: куда-то исчез пример gsoap_qt_probe.2011.01.31.zip.... не знаю - говорит "404 - вложение не найдено". Куда дели?!
По просьбам публики - выкладываю обновленнй пример. gsoap_qt_probe.2011.01.31.zip. Лицензия на примеры - LGPL.
В примерах вы найдете : qt-сервер(gSoap), qt-клиент(gSoap), php-клиент(phpSoap).
В qt-сервер добавлена обработка get запросов (и обратившись на :8080-порт в браузере можно лицезреть сраничку и скачать wsdl который лежит рядом).
« Последнее редактирование: Апрель 07, 2011, 12:41 от Denjs » Записан
Denjs
Гость
« Ответ #2 : Январь 31, 2011, 16:29 »

теперь немного о грустном.
с "WSF Staff" играться, похоже, можно только под "студией" граблепроизводителя.
MinGW отказывается компилять код инклюдов с переменными типа TChar .
Как избавиться от этого без большого напильника пока не представляю... Жаль...

пока разбираться не хочу, тем более gSoap "начал взлетать".
« Последнее редактирование: Январь 31, 2011, 16:37 от Denjs » Записан
Denjs
Гость
« Ответ #3 : Февраль 01, 2011, 11:20 »

gSoap: обнаружена проблема с русскими наименованиями функций и полей.
Генератор кода gSoap создает структуры, переменные классов и имена функций в соответствии с их наименованиями в WSDL-файле, но в силу ограничений C++ на имена функций и структур не могут именоваться по русски, и в итоге генерируются имена типов вида
Код:
ns1___x00d0_x0094_x00d0_x00be_x00d0_x00ba_x00d1_x0083_x00d0_x00bc_x00d0_x00b5_x00d0_x00bd_x00d1_x0082
что как вы понимаете делает работу с таким кодом затруднительной.

Функций вызова функций вебсервиса по имени (например callF(functionNam, args) ) я пока не нашел...
Записан
Barmaglodd
Гость
« Ответ #4 : Февраль 01, 2011, 15:18 »

Может руками, а? У вас так много различных сервисов или вы хотите добавлять их динамически в рантайме? Я для Erlang'а тоже долго искал что-нибудь для SOAP, но потом оказалось проще руками.
Записан
Denjs
Гость
« Ответ #5 : Февраль 01, 2011, 16:31 »

Может руками, а? У вас так много различных сервисов или вы хотите добавлять их динамически в рантайме? Я для Erlang'а тоже долго искал что-нибудь для SOAP, но потом оказалось проще руками.
В смысле "руками"? можете пояснить? руками дергать сервис? или формировать SOAP-пакеты? работать по варианту "как с QtSoap" я не хочу.

Я хочу загрузить WSDL и получить простое внятное описание сигнатур функций и струкур данных (пусть и не в рантайме). Просто для того, что бы иметь возможность быстро создать/адаптировать клиента. Или сделать аналог "мастера импорта веб-сервиса".

Т.е. я сейчас фактически ищу "малогеморройный" механизм работы с веб-сервисами при  "почти"-промышленной разработке.
« Последнее редактирование: Февраль 01, 2011, 16:33 от Denjs » Записан
Barmaglodd
Гость
« Ответ #6 : Февраль 02, 2011, 09:50 »

В смысле "руками"? можете пояснить? руками дергать сервис? или формировать SOAP-пакеты?
Именно руками дергать сервис и формировать SOAP-пакеты.
Но если вам надо "мастера импорта веб-сервиса", то не вариант.

Я к тому, что иногда проще и быстрее тупое решение "в лоб", чем поиск и изучение универсального мега-фреймворка. Улыбающийся
Записан
twp
Гость
« Ответ #7 : Февраль 02, 2011, 10:47 »

Может руками, а? У вас так много различных сервисов или вы хотите добавлять их динамически в рантайме? Я для Erlang'а тоже долго искал что-нибудь для SOAP, но потом оказалось проще руками.
В смысле "руками"? можете пояснить? руками дергать сервис? или формировать SOAP-пакеты? работать по варианту "как с QtSoap" я не хочу.

Я хочу загрузить WSDL и получить простое внятное описание сигнатур функций и струкур данных (пусть и не в рантайме). Просто для того, что бы иметь возможность быстро создать/адаптировать клиента. Или сделать аналог "мастера импорта веб-сервиса".

Т.е. я сейчас фактически ищу "малогеморройный" механизм работы с веб-сервисами при  "почти"-промышленной разработке.
Есть готовое решение http://www.clausmark.com/index.php/feast.html
Насколько я знаю там есть генератор исходников с WSDL-файла и свой сервер. Но к сожалению это коммерческий продукт
Записан
Denjs
Гость
« Ответ #8 : Февраль 02, 2011, 11:05 »

Есть готовое решение http://www.clausmark.com/index.php/feast.html
Насколько я знаю там есть генератор исходников с WSDL-файла и свой сервер. Но к сожалению это коммерческий продукт
Спасибо, пополнил список продуктов. (пункт "FEAST")

Но полагаю в смысле коммерческих продуктов, kdSoap выглядит привлекательнее - там есть возможность поиграться в начале с GPL.
Кто пользовал KdSoap и|или FEAST?
« Последнее редактирование: Февраль 02, 2011, 11:08 от Denjs » Записан
twp
Гость
« Ответ #9 : Февраль 02, 2011, 11:21 »

Я имел дело с FEAST, с версией 1.3 вроде, там использовалась СУБД (поддерживалось 3 типа СУБД) для логирования и еще для каких-то целей. И она была чисто виндовая. Потом ее выкинули с проекта и заменили своей разработкой. К тому времени появилась версия 2.3 в которая уже не нуждается в СУБД и она уже поддерживает Mac Os X и Linux.
Записан
dem
Гость
« Ответ #10 : Февраль 17, 2011, 14:22 »

 WSF Staff теперь собирается под MinGW.

Дистрибутив собранный в GCC (MinGW): http://code.google.com/p/staff/downloads/detail?name=ws-win32-gcc4.5.2-staff-2.0.0-tp4-r399.7z

Инструкция по установке: http://code.google.com/p/staff/wiki/InstallationManualWindowsBinary

Создание С++ клиента, использующего Qt (из WSDL, в Qt Creator'e): http://code.google.com/p/staff/wiki/ExampleStockQuoteQtCreator
Записан
Denjs
Гость
« Ответ #11 : Февраль 17, 2011, 15:24 »

WSF Staff теперь собирается под MinGW.<...>
респект. обновил статусы и описания в стартовом посте.
Записан
Denjs
Гость
« Ответ #12 : Март 11, 2011, 03:00 »

Пока не лень, отпишу ещё пару строк про gSOAP, раз уж я с ним уже завязался...

Начал отгребать немного проблем с Русскими буквами. но успешно вроде решил о чем тут и пишу "как это было".
Просто как-то в документации об этом было не совсем внятно описано, пришлось зесть в дебри исходного кода и смотреть на что он там смотрит....

Поддержка Русского в контенте - строки и прочее (UTF-8).
Если вы генерируете ws-сервер, и вам необходимо отдавать строки содержащие Русский язык, необходимо :
 - вебсервис инициировать с доп установками
Код:
myWsServiceClassGeneratedByGSOAP server(SOAP_IO_DEFAULT|SOAP_C_UTFSTRING);
- не забыть определить кодировку ваших исходников
Код:
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
     QTextCodec::setCodecForCStrings (codec);
     QTextCodec::setCodecForTr(codec);
     QTextCodec *codec2 = QTextCodec::codecForName("UTF-8");
     QTextCodec::setCodecForLocale(codec2);
- и уже только после этого, можно отдавать внутрь utf-8 строки в определении функций вашего сервиса
(ниже - updateEvent - это класс который я должен отдать на выходе, eventData - это поле типа std::string
Код:
  QString returnRussianString;
  updateEvent.eventData= returnRussianString.toStdString();//uses CodecForCStrings
 


стоит отметить, что классы ws-сервера я генерировал из .h-описания (файл ws_interface_defenition.h) примерно такого вида:
Код:
//this string have to be included for ability to import STL types
#import "stllist.h"

//это технические указания кодогенератору! не удалять!!
// File: ws_interface_defenition.h
//gsoap ns service name: myWsServiceClassGeneratedByGSOAP
//gsoap ns service namespace: urn:myWsServiceClassGeneratedByGSOAP
//gsoap ns service location: http://127.0.0.1:8080/

//-------------------------------------------------------------------------------
// UTF-8 encoded

//-------------------------------------------------------------------------------
// структуры
//-------------------------------------------------------------------------------
class ns__session //Сессия
    {public:
        std::string guid;
        std::string userName;
        std::string userGroups;
        std::string startime;
    };

class ns__result //результат
    {public:
        int code;
        std::string descriptin;
        std::list<ns__session> sessions; //пример того, как определить список в структуре
    };
//-------------------------------------------------------------------------------
// функции
//-------------------------------------------------------------------------------

int ns__login( std::string user, std::string pass, ns__session& session );  //
int ns__sessions( ns__session session, ns__result& result );  // пример того, как определить сервис принимающий на входе структуру

вот примерно такой строкой генерации классов веб-сервиса
Код:
soapcpp2 -s -t -x -i -S -IC:\ws\gsoap-2.8\gsoap\;C:\ws\gsoap-2.8\gsoap\import\; .\ws_interface_defenition.h

За сим всем снова удачи.
« Последнее редактирование: Март 11, 2011, 03:05 от Denjs » Записан
Denjs
Гость
« Ответ #13 : Март 22, 2011, 23:05 »

Пока не лень, отпишу ещё пару строк про gSOAP, т.к. я с ним уже завязался и проект живет и развивается...
на этот раз про отладку и отслеживание сырых посылок (просмотр сырых SOAP-пакетов).

Способ 1.
В документации есть указание на то, что вы можете активировать "отладочный режим" работы генерируемых классов если в исходном тексте будет определен "DEBUG". Более того, в строке 740 (или около того) файла stdsoap2.h (тоже автогенерируемый) видим следующее:
Код:
//#define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and messages (in file TEST.log) */

Т.е. все понятно без комментариев.
Все посылки, он будет скидывать в файлы. Удобно? ну уж лучше чем ничего))))

Способ 2
Способ 1 хорош, все работает... но надо пересобирать программу, и более того - если мне пакеты надо отслеживать только при ошибках - то это никак не годится...

Например - надо проанализировать пакет, переданный мне Axis-сервером когда у него возник "500 - internal error"?
Плюс, в таких случаях, мне нужен программный доступ к этим самым "сырым данным" в самом коде, а не в логе...

В документации я ответа не нашел (или пропустил...?).

Поковырявшись в исходниках класса soap, нашел что класс предусматривает подключение обработчиков на события формирования и обработки "сырых данных". Вернее сырые данные туда передаются в качестве параметров... Что собственно и надо.

В общем, код ниже думаю вам все расскажет.
Для затравки и понимания механизмов думаю достаточно.

Код:
...
QString cRawReceive;
QString cRawSend;

int my_fPrepareInitSend(struct soap* _soap)
    {   cRawSend="";
        return _soap->error; //return SOAP_OK;
    };
int my_fPrepareInitRecv(struct soap* _soap)
    {  cRawReceive="";
        return _soap->error; //return SOAP_OK;
    };

int my_fPrepareSend(struct soap* _soap, const char* _buf, size_t _size)
    {   cRawSend += QString::fromUtf8(QByteArray(_buf,_size));
        return _soap->error; //return SOAP_OK;
    };
int my_fPrepareRecv(struct soap* _soap, const char* _buf, size_t _size)
    {   cRawReceive += QString::fromUtf8(QByteArray(_buf,_size));
        return _soap->error;
    };

int my_fPrepareFinalRecv(struct soap* _soap) //успешно отослали запрос
    {   //qDebug() << QString(" ->() :%1:  Raw Receive Data: \n%2\n").arg(QDateTime::currentDateTime().toString("yyyy.MM.dd_hh:mm:ss_zzz")).arg(cRawReceive);
        return _soap->error;
    };
int my_fPrepareFinalSend(struct soap* _soap) //успешно приняли ответ
    {   //qDebug() << QString(" <-() :%1:  Raw Send Data:  \n%2\n").arg(QDateTime::currentDateTime().toString("yyyy.MM.dd_hh:mm:ss_zzz")).arg(cRawSend);
        return _soap->error;
    };

...
main()
{
...
     myServiceSoapBindingProxy soapObj(SOAP_IO_DEFAULT|SOAP_C_UTFSTRING);

     //обработчики для перехвата сырых данных ввода-вывода последнего зароса. На всякий случай.
     soapObj.fpreparerecv = my_fPrepareRecv; //для данных получения обычно этого достаточно
     soapObj.fpreparesend = my_fPrepareSend; //а вот это вызывается часто и по немногу...
     soapObj.fprepareinitsend = my_fPrepareInitSend;
     soapObj.fprepareinitrecv = my_fPrepareInitRecv;
     soapObj.fpreparefinalsend = my_fPrepareFinalSend;;
     soapObj.fpreparefinalrecv = my_fPrepareFinalSend;;
...
     int rez=soapObj.callMyWSFunction(..., ...);

    if (rez==SOAP_OK)
        {
...
        }
    else
        {
            qDebug() << " ERROR DUE SOAP ASKING. Err code = [" << rez << "]. Debug Data is: ";
            qDebug() << " \n  Last Raw Send Data: " << cRawSend ;
            qDebug() << " \n  Last Raw Receive Data: " << cRawReceive ;
        };
...
}

PS:Потом, как доиграемся до донца, расскажу про то, как к GSoap/Axis/Axis2 веб-сервисам подключать "мать-перемать-1цэ" в качестве клиента.
« Последнее редактирование: Март 22, 2011, 23:12 от Denjs » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.072 секунд. Запросов: 20.