QT+Gsoap访问cxf WebService

来源:互联网 发布:bp神经网络算法 matlab 编辑:程序博客网 时间:2024/05/17 20:28

内容:如题

需求描述:现有springMvc框架的系统,里面跑着业务数据,又开发一QT界面,需要调用java系统的数据

思路:  java端用cxf发布出webService接口  客户端:用Gsoap 将cxf发布的wsdl文件转换成c++文件,然后调用。

环境:win10  QT5+  cxf  Springmvc

步骤:

一:gsoap安装

    下载gsoap安装文件,很简单,下载后直接解压即可使用,我下载的是gsoap_2.8.51;

    gsoap配置环境变量(当然影像不大,配置环境变量后,后面操作相对简单)

    如下图所示:在path中增加gsoap的win32路径


  


二: 假设此处java项目中的webService可以访问(此处不再详细说明)

       我的可以正常访问:如下图所示:


这时证明你 的服务端已经正常。


三:新建目录D:\QT\gsoapSource(可根据实际情况随意建立)

进入windows命令窗口

cd 进入到上述建立的目录下

cd D:\QT\gsoapSource

将wsdl文件转成.h文件

执行命令wsdl2h  -o taskInfo.h http://(服务端的ip)/taskTodo/webService/taskInfo?wsdl (后面的地址为第二大项中的wsdl的地址)


此时,在D:\QT\gsoapSource 目录下,你会看到生成了,taskInfo.h文件


此时,再执行命令:soapcpp2 taskInfo.h -I E:\tools\应用软件\gsoap_2.8.51\gsoap-2.8\gsoap\import (备注:-I后面指定了gsoap的安装路径下的import路径,根据自己情况改动)




此时,会在目录下生成一堆文件,暂且不管是什么用途

至此,准备工作已经准备完成,接下来就是QT端的开发:


四:建立QT客户端工程(具体步骤不再细说)

工程结构如下图所示:



其中主要是.pro文件,widget.h及widget.cpp文件

生成项目后,先在widget.cpp平级的目录下的建立gsoap文件夹,将第三步最后生成在gsoapSource文件下的文件除了.xml文件之外的所有文件都复制到gsoap文件夹下(网上有人说没必要全要,此处为了避免漏掉,都拿过来),除此之外,还需要将gsoap安装路径下的3个重要文件(stdsoap2.cpp、stdsoap2.c、stdsoap2.h)复制到此文件夹下


接下来,看看QT里面上面所说的3个文件的代码

.pro代码  其中LIBS后面的值根据自己QT环境配置

#-------------------------------------------------## Project created by QtCreator 2017-08-09T17:22:13##-------------------------------------------------QT       += core guiLIBS += C:\Qt\Qt5.6.2\Tools\mingw492_32\i686-w64-mingw32\lib\libws2_32.agreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = TestTEMPLATE = appSOURCES += main.cpp\        widget.cpp\    gsoap/stdsoap2.cpp \    gsoap/soapClient.cpp \    gsoap/soapC.cppHEADERS  += widget.h\    gsoap/stdsoap2.h \    gsoap/soapStub.h \    gsoap/soapH.hINCLUDEPATH += gsoap
widget.c

#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QLabel>#include <QTextEdit>class QPushButton;class QLineEdit;class Widget : public QWidget{    Q_OBJECTpublic:    Widget(QWidget *parent = 0);    ~Widget();public slots:    void OnClicked();private:    QPushButton *btn;//    QLineEdit *line;    QTextEdit *line;    QLabel *labelUserName;    QLineEdit *editUserName;    QLabel *labelPassWord;    QLineEdit *editPassWord;     QLabel *labelresult;};#endif // WIDGET_H

widget.cpp

#include "widget.h"#include <QPushButton>#include <QLineEdit>#include <QHBoxLayout>#include <QDebug>#include <QGridLayout>#include <QJsonArray>#include <QJsonObject>#include <QJsonDocument>#include "TaskInfoWebServiceSoapBinding.nsmap"Widget::Widget(QWidget *parent)    : QWidget(parent){    setWindowTitle(tr("获取任务信息"));    setFixedSize(800,500);       labelUserName =new QLabel(tr("用户名:"));       editUserName =new QLineEdit;       labelPassWord =new QLabel(tr("密码:"));       editPassWord =new QLineEdit;       labelresult  = new  QLabel(tr("结果:"));    btn =new QPushButton("提交");   line = new QTextEdit;   connect(btn,SIGNAL(clicked()),this,SLOT(OnClicked()));   QGridLayout *layout = new QGridLayout;   layout->addWidget(labelUserName,0,0);   layout->addWidget(editUserName,0,1);   layout->addWidget(labelPassWord,1,0);   layout->addWidget(editPassWord,1,1);   layout->addWidget(labelresult,2,0);   layout->addWidget(line,2,1);   layout->addWidget(btn,3,0);   setLayout(layout);}Widget::~Widget(){}void Widget::OnClicked(){    struct soap add_soap;    soap_init(&add_soap);    soap_set_mode(&add_soap,SOAP_C_UTFSTRING);    ns1__findUserTaskInfo req;    std::string name =editUserName->text().toStdString();  // 由赋值进行初始化    std::string password =editPassWord->text().toStdString();    req.userName=&name;    req.passWord=&password;    ns1__findUserTaskInfoResponse res;    QString str;    int result = soap_call___ns1__findUserTaskInfo(&add_soap,NULL,NULL,&req,res);    if (result == SOAP_OK)    {//        qDebug()<<res.return_->c_str();       str = QString::fromUtf8(res.return_->c_str());    }    else    {        str = tr("Failed");    }    line->setText(str);}

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    Widget w;    w.show();    return a.exec();}


运行QT工程如下图所示:


ok,至此,结束


注意:我的webService 接口是中接收两个参数,userName和passWord,然后调用数据库进行验证,返回对应用户的字符串数据,然后显示到QT的结果框中,测试的时候可以简单写个测试接口进行调用。


原创粉丝点击