qt wsdl的接口调用真没c# 好用。c#一分钟就能搞定,qt 呵呵。。。
算了,开始正题:
第一步:下载 gsoap
1 、 下载链接:https://www.genivia.com/products.html,下载开源版本
2、 解压文件 ,将解压后的文件随便放个地方
第二步、 用gsoap生成接口文件
1 、用电脑的 “命令处理器” (cmd.exe)
2.、将cmd路径指定到 gsoap_2.8.122\gsoap-2.8\gsoap\bin\win64 下
3、生成接口包含文件 “myESealSoap.h”,
输入 : wsdl2h -o myESealSoap.h http://xxxxxxxxxxx/ImpExpService?wsdl
会在 gsoap_2.8.122\gsoap-2.8\gsoap\bin\win64 下面生成 myESealSoap.h 文件。
wsdl2h : gsoap的程序
myESealSoap.h: 包含接口的文件,自己随便起个
http://xxxxx/ImpExpService?wsdl : 接口url
4、 生成可调用接口文件
继续输入: soapcpp2 myESealSoap.h -I C:\gsoap_2.8.122\gsoap-2.8\gsoap\import
C:\gsoap_2.8.122\gsoap-2.8\gsoap\import : 这个根据自己放的位置修改,一定要指定到 import 文件
5、 QT程序目录下面建个文件夹, 将上面这些文件拷贝过去, 并将 gsoap_2.8.122\gsoap-2.8\gsoap 下的 stdsoap2.cpp stdsoap2.h 拷贝进去
最终需要的文件就是这些
第三步: qt工程调用接口
1. 在 .pro 文件中 添加
- SOURCES += \
- myGsoap/soapC.cpp \
- myGsoap/soapClient.cpp \
- myGsoap/stdsoap2.cpp\
-
- HEADERS += \
- myGsoap/soapH.h \
- myGsoap/soapStub.h \
- myGsoap/stdsoap2.h
-
- INCLUDEPATH += ./myGsoap
-
- LIBS += -lws2_32 # 这个特别重要,一定要加
2. 在主程序中,添加 头文件
- #include "myGsoap/soapH.h"
- #include "myGsoap/ImpExpServiceSoap11Binding.nsmap"
- #include "myGsoap/soapStub.h"
- #include "myGsoap/stdsoap2.h"
3. 调用接口
- void MainWindow::on_pushButton_clicked()
- {
- struct soap m_soap;
- soap_init(&m_soap);
- soap_set_mode(&m_soap,SOAP_C_UTFSTRING); //解决gsoap中文乱码问题
- _ns1__eUserLogin req; // 传递数据, 和接口名对应 _ns1__xxxxx
- _ns1__eUserLoginResponse res; // 接收数据, 和接口名对应 _ns1__xxxxxResponse
-
- // 生成json 数据
- QJsonObject jsonObj;
- jsonObj.insert ("userAccount",ui->userName->text().trimmed());
- jsonObj.insert ("password",ui->passWord->text().trimmed());
- QJsonDocument document(jsonObj);
- std::string jsonString = document.toJson(QJsonDocument::Compact).toStdString(); // json 转为std::string
- req.jsonPara = &jsonString; // 添加要传递的参数 (根据接口参数格式传递)
-
- qDebug() << document.toJson(QJsonDocument::Compact);
-
- // 调用接口 soap_call__ns1__接口名称(); soap_call__ns1 这个是固定的
- if (soap_call___ns1__eUserLogin(&m_soap,NULL,NULL, &req, res) == SOAP_OK)
- {
- qDebug()<<"接口调用成功";
- }
-
- if(m_soap.error != 0){
- //获取错误提示
- QString errStr = QString::fromLocal8Bit(*soap_faultstring(&m_soap));
- qDebug()<< "错误提示: " << errStr;
- }
- else {
- //获取结果字符串
- QByteArray strRes = res.return_->c_str();
-
- // 拆解json
- QJsonDocument doc =QJsonDocument::fromJson(strRes);
- if(doc.isObject())
- {
- QJsonObject obj =doc .object();
- qDebug()<< obj.value("retMsg").toString();
- }
-
- // 打印整个返回结果
- qDebug()<
"utf8")->toUnicode(strRes); - }
- soap_end(&m_soap);
- soap_done(&m_soap);
- }
最后:
这个东西真心难用, 如果接口发生改变, 就得重新生成接口文件, 麻烦的要死