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()<<QTextCodec::codecForName("utf8")->toUnicode(strRes);
}
soap_end(&m_soap);
soap_done(&m_soap);
}
最后:
这个东西真心难用, 如果接口发生改变, 就得重新生成接口文件, 麻烦的要死