一,利用QtSoap 第三方库方式

参考:GitHub - commontk/QtSOAP: The Qt SOAP project provides basic web service support with version 1.1 of the SOAP protocol. It is fork of

二,利用 http post方式,自己拼接xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://portal.vidyo.com/user/v1_1">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:SearchRequest>
         <v1:Filter>
            <v1:query>liunianji</v1:query>
         </v1:Filter>
      </v1:SearchRequest>
   </soapenv:Body>
</soapenv:Envelope>

在一些复杂的xml格式下,如上述格式 <v1:query>  上层有好多父节点, 利用第一种没有搞定 所以选择了第二种方式

(1),拼接 xml

QDomDocument doc;QDomElement tagStart = doc.createElement("soapenv:Envelope");tagStart.setAttribute("xmlns:soapenv","http://schemas.xmlsoap.org/soap/envelope/");tagStart.setAttribute("xmlns:v1","http://portal.vidyo.com/user/v1_1");QDomElement tagHeader = doc.createElement("soapenv:Header");QDomElement tagBody = doc.createElement("soapenv:Body");doc.appendChild(tagStart);tagStart.appendChild(tagHeader);tagStart.appendChild(tagBody);QDomElement tagSearchRequest = doc.createElement("v1:SearchRequest");QDomElement tagFilter = doc.createElement("v1:Filter");QDomElement tagQuery = doc.createElement("v1:query");QDomText queryName = doc.createTextNode(displayName);tagBody.appendChild(tagSearchRequest);tagSearchRequest.appendChild(tagFilter);tagFilter.appendChild(tagQuery);tagQuery.appendChild(queryName);

(2),post 发送

QString webSite = QString("%1/services/v1_1/VidyoPortalUserService/").arg(m_portal);QByteArray postBa = doc.toByteArray();QByteArray retBa;QNetworkReply::NetworkError ret=WebHelp::getInstance()->sendPostRequest(webSite,postBa,retBa);if(ret==QNetworkReply::NoError){qDebug()<< QString(retBa);return parseSearchClassRe(retBa);}else{qDebug()<< QStringLiteral("网络错误,请检查网络!")<<ret;}

三,封装好的 单例类

class   WebHelp:public QObject
{Q_OBJECT
private:class Dispose{public:~Dispose();};
public:static WebHelp * getInstance();~WebHelp();public:QNetworkReply::NetworkError sendGetRequest(QString urlStr, QByteArray & ba, int timeOutms=3000);QNetworkReply::NetworkError sendPostRequest(QString website,const QByteArray & postBa, QByteArray& retBa, int timeOutms=3000);protected slots:void slot_error(QNetworkReply::NetworkError code);void provideAuthenication(QNetworkReply*,QAuthenticator*);
private:static WebHelp * serverHelp;static WebHelp::Dispose disp;QNetworkAccessManager *manager;QNetworkReply::NetworkError m_errCode;QString m_pwd;QString m_user;
private:WebHelp(QObject *parent=0);};class NetDataListenerThread:public QThread
{Q_OBJECT
public:NetDataListenerThread(QNetworkAccessManager *manager,QNetworkReply * reply,int timeoutms,QObject *parent = 0);~NetDataListenerThread();QByteArray getBa() const;bool getIsWaitTimeOut() const;protected:virtual void run();
private:bool waitForConnect();
protected slots:void slot_waitTimeout();signals:void sig_waitTimeout();
private:QNetworkAccessManager *mManager;int m_TimeOutms;bool m_waitTimeOut;bool m_isWaitTimeOut;QNetworkReply * m_reply;
};
NetDataListenerThread::NetDataListenerThread(QNetworkAccessManager *manager, QNetworkReply *reply, int timeoutms, QObject *parent):QThread(parent),mManager(manager),m_TimeOutms(timeoutms),m_reply(reply)
{m_waitTimeOut = false;m_isWaitTimeOut = false;
}NetDataListenerThread::~NetDataListenerThread()
{}void NetDataListenerThread::run()
{m_isWaitTimeOut = waitForConnect();
}bool NetDataListenerThread::waitForConnect()
{QEventLoop eventLoop;QTimer * timer = nullptr;m_waitTimeOut = false;bool bWaitTimeOut = false;if (m_TimeOutms > 0){timer = new QTimer;connect(timer, SIGNAL(timeout()), this, SLOT(slot_waitTimeout()));timer->setSingleShot(true);timer->start(m_TimeOutms);connect(this, SIGNAL(sig_waitTimeout()), &eventLoop, SLOT(quit()));}connect(mManager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));if (m_reply != nullptr){connect(m_reply, SIGNAL(readyRead()), &eventLoop, SLOT(quit()));}eventLoop.exec();if (timer != nullptr){timer->stop();delete timer;timer = nullptr;}bWaitTimeOut = m_waitTimeOut;m_waitTimeOut = false;return !bWaitTimeOut;
}void NetDataListenerThread::slot_waitTimeout()
{m_waitTimeOut = true;emit sig_waitTimeout();
}bool NetDataListenerThread::getIsWaitTimeOut() const
{return m_isWaitTimeOut;
}WebHelp * WebHelp::serverHelp = nullptr;
WebHelp::Dispose WebHelp::disp;WebHelp::WebHelp(QObject *parent):QObject(parent)
{m_user = SetupWidget::gConfig.user();m_pwd = SetupWidget::gConfig.pwd();manager = new QNetworkAccessManager();m_errCode= QNetworkReply::NoError;connect(manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),SLOT(provideAuthenication(QNetworkReply*,QAuthenticator*)));
}WebHelp::~WebHelp()
{manager->deleteLater();}WebHelp *WebHelp::getInstance()
{if(serverHelp==nullptr){serverHelp = new WebHelp();}return serverHelp;
}QNetworkReply::NetworkError WebHelp::sendGetRequest(QString urlStr, QByteArray & ba,int timeOutms)
{QNetworkReply::NetworkError retError = QNetworkReply::NoError;m_errCode= QNetworkReply::NoError;QNetworkRequest request;QUrl url(urlStr);request.setUrl(url);QNetworkReply *reply = manager->get(request);connect(reply,static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),this,&WebHelp::slot_error);QEventLoop eventLoop;NetDataListenerThread * thread = new NetDataListenerThread(manager,reply,timeOutms);connect(thread, &NetDataListenerThread::finished,&eventLoop,&QEventLoop::quit);thread->start();eventLoop.exec();if(thread->getIsWaitTimeOut()){ba = reply->readAll();}else{m_errCode=QNetworkReply::TimeoutError;}thread->deleteLater();delete reply;delete thread;thread = nullptr;retError = m_errCode;m_errCode= QNetworkReply::NoError;return retError;
}QNetworkReply::NetworkError WebHelp:: sendPostRequest(QString website, const QByteArray &postBa, QByteArray &retBa, int timeOutms)
{QString urlStr =website;QNetworkReply::NetworkError retError = QNetworkReply::NoError;m_errCode= QNetworkReply::NoError;QNetworkRequest request;QSslConfiguration config;config.setPeerVerifyMode(QSslSocket::VerifyNone);config.setProtocol(QSsl::TlsV1SslV3);request.setSslConfiguration(config);QUrl url(urlStr);request.setUrl(url);request.setHeader( QNetworkRequest::ContentTypeHeader, QVariant(QString("text/xml;charset=utf-8")));request.setHeader(QNetworkRequest::ContentLengthHeader, QVariant(qulonglong(postBa.size()) ));request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QVariant( int(QNetworkRequest::AlwaysNetwork)));QNetworkReply *reply = manager->post(request,postBa);connect(reply,static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),this,&WebHelp::slot_error);QEventLoop eventLoop;NetDataListenerThread * thread = new NetDataListenerThread(manager,reply,timeOutms);connect(thread, &NetDataListenerThread::finished,&eventLoop,&QEventLoop::quit);thread->start();eventLoop.exec();if(thread->getIsWaitTimeOut()){retBa = reply->readAll();}else{m_errCode=QNetworkReply::TimeoutError;}thread->deleteLater();delete reply;delete thread;thread = nullptr;retError = m_errCode;m_errCode= QNetworkReply::NoError;return retError;
}void WebHelp::slot_error(QNetworkReply::NetworkError code)
{m_errCode = code;
}void WebHelp::provideAuthenication(QNetworkReply *, QAuthenticator *ator)
{ator->setUser(m_user);ator->setPassword(m_pwd);
}WebHelp::Dispose::~Dispose()
{if(WebHelp::serverHelp!=nullptr){delete WebHelp::serverHelp;WebHelp::serverHelp=nullptr;}
}

四,备注

(1),如果网站需要用户名 和密码 需要再此处设置

void WebHelp::provideAuthenication(QNetworkReply *, QAuthenticator *ator)
{ator->setUser(m_user);ator->setPassword(m_pwd);
}

(2),两个 header 可能略有不同

request.setHeader( QNetworkRequest::ContentTypeHeader, QVariant(QString("text/xml;charset=utf-8")));request.setHeader(QNetworkRequest::ContentLengthHeader, QVariant(qulonglong(postBa.size()) ));

Qt 访问 webservice 服务相关推荐

  1. 在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决

    在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决 参考文章: (1)在Android中调用KSOAP2库访问webservice服务出现的服务端 ...

  2. python suds_python suds访问webservice服务实现

    安装suds 在Python3环境下如果使用:pip install suds,应该会报ImportError: No module named client,这里推荐安装suds-py3. 使用 1 ...

  3. VS2008非托管c++访问webservice服务(以WeatherWS 天气服务 为例)

    在Visual Studio 2008以及以后版本中,微软停止了非托管C++的直接WebService引用.不过ATL Server代码已经托管到开源网站上,我们可以找到ATL Server的源代码, ...

  4. qt linux webservice,Qt实现访问WebService

    之前也许是因为根本不用的原因吧,,,根本没有想过Qt访问WebService的方式.... 要解决这个问题,因为Qt现行版没有提供直接访问的类库...首先是一些必备知识, 我连的服务器是用VS2010 ...

  5. JAX-WS RI组件开发基于JAX-WS规范的WebService服务入门程序

    一.服务端 创建一个普通的web项目:JaxWS_ri_calculator_server 先把服务端项目完成之后完整的结构示意图展示出来,方便你们做参考: 1.创建提供webservice服务的服务 ...

  6. linux webservice服务器端,Linux查看资源使用情况 webservice服务端口监控

    本人在最近的项目过程中,发现一个很严重的问题 在我们写的一个应用中,jboss作应用程序的容器,其中加载了webservice服务.每次服务运行一段时间后,大概几天时间以后,发现很奇怪的现象.我们的j ...

  7. C++通过GSoap访问webService

    最近在wince机器上做一个了项目要求访问wcf服务,看了一些资料了解到可以通过gsoap实现.刚刚弄通了写个小结日后回顾,有需要的也可以看看,有问题可以联系我bike_c@163.com 1.  下 ...

  8. 使用Axis2创建一个简单的WebService服务

    使用过Java进行过WebService开发都会听过或者接触过Apache Axis2,Axis2框架是应用最广泛的WebService框架之一了. 这里使用Axis2来开发和部署一个最简单的WebS ...

  9. [置顶]WebService学习总结(4)——第三方webService服务调用

    互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为 ...

最新文章

  1. android 支付宝支付 出现系统繁忙,请稍后重试(ALI10)
  2. 也许你所知道的学习方法都是错的
  3. 【STM32】学习笔记RTC日历基础应用问题分析
  4. oracle aced什么资质,ACOUG 中国行—暨Oracle WDP云数据之旅,火热报名中……
  5. TestNG或JUnit
  6. amd cpu不能在cmd环境下运行java代码_「我们一起学Java02」JDK、JRE、JVM简介,Java开发平台的搭建...
  7. Red 编程语言 2019 开发计划:全速前进!
  8. antd vue关闭模态对话框_Vue.extend 登录注册模态框
  9. 打断点是什么意思_佛学基础知识(股票所说的大盘几千点,是指的什么意思)
  10. Unity HTC Vive手柄汉诺塔操作
  11. asp人脸识别,asp刷脸识别接口代码,微信公众号人脸识别代码
  12. java fckeditor下载_FCKEditor的使用
  13. 悉尼大学计算机科学与技术专业,墨尔本大学和悉尼大学计算机专业选哪个好?...
  14. Vue实现京东登陆页面(仅实现部分功能)
  15. access IIf函数
  16. python爬虫(19)爬取论坛网站——网络上常见的gif动态图
  17. 矩阵的三角分解法之LU分解之Doolittle分解
  18. java实现单链表就地逆置,20. 微软面试题:单链表就地逆放
  19. 10 Python Matplotlib 绘制极坐标图和散点图
  20. 【天线基础-天线原理、定义和分类】

热门文章

  1. 【SCI征稿】中科院2区(TOP)录用后立即出版!
  2. 技术贴:解码时AVC1和H264的区别
  3. (计算机视觉课程-笔记1)图像边缘检测
  4. feed流和瀑布流_内容时代已来,别说你还不懂feed流
  5. html 边框立体效果,巧用边框线实现立体按钮效果(纯CSS)
  6. 【VMware虚拟化解决方案】 基于VMware虚拟化平台VDI整体性能分析与优化
  7. 维瓦尔第_维瓦尔第:歌剧的精神继任者
  8. (二)小程序云开发之aggregate.geoNear()获取两地理点之间距离
  9. java塔_Java-河内塔问题
  10. javascript常用到的东西(珍藏)