QT+Gsoap访问cxf WebService
内容:如题 需求描述:现有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 += 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); 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的结果框中,测试的时候可以简单写个测试接口进行调用。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |