加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

QT+Gsoap访问cxf WebService

发布时间:2020-12-16 21:46:08 所属栏目:安全 来源:网络整理
导读:内容:如题 需求描述:现有springMvc框架的系统,里面跑着业务数据,又开发一QT界面,需要调用java系统的数据 思路:? java端用cxf发布出webService接口? 客户端:用Gsoap 将cxf发布的wsdl文件转换成c++文件,然后调用。 环境:win10? QT5+? cxf? Springmvc

内容:如题

需求描述:现有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:QTgsoapSource(可根据实际情况随意建立)

进入windows命令窗口

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

cd D:QTgsoapSource

将wsdl文件转成.h文件

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


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


此时,再执行命令:soapcpp2 taskInfo.h -I E:tools应用软件gsoap_2.8.51gsoap-2.8gsoapimport (备注:-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 gui
LIBS += C:QtQt5.6.2Toolsmingw492_32i686-w64-mingw32liblibws2_32.a
greaterThan(QT_MAJOR_VERSION,4): QT += widgets

TARGET = Test
TEMPLATE = app


SOURCES += main.cpp
        widget.cpp
    gsoap/stdsoap2.cpp 
    gsoap/soapClient.cpp 
    gsoap/soapC.cpp

HEADERS  += widget.h
    gsoap/stdsoap2.h 
    gsoap/soapStub.h 
    gsoap/soapH.h

INCLUDEPATH += gsoap
widget.c

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QTextEdit>

class QPushButton;
class QLineEdit;

class Widget : public QWidget
{
    Q_OBJECT

public:
    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);
   layout->addWidget(editUserName,1);
   layout->addWidget(labelPassWord,1,0);
   layout->addWidget(editPassWord,1);
   layout->addWidget(labelresult,2,0);
   layout->addWidget(line,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,&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的结果框中,测试的时候可以简单写个测试接口进行调用。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读