内容:如题
需求描述:现有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 gui LIBS += C:\Qt\Qt5.6.2\Tools\mingw492_32\i686-w64-mingw32\lib\libws2_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 += gsoapwidget.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,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的结果框中,测试的时候可以简单写个测试接口进行调用。