QT提供了QNetworkAccessManager来访问。QT帮助文档里有这么一段
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager,SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
可以看出,要调用webservice必须要有两个函数的。
需要有一个replyFinished槽函数来响应返回来请求的数据。
很多时候我们需要用到只需要一个函数的,比如现在我想写一个函数
UserInfo getAllUserInfoList(); 得到所有的用户列表,这时又一个webservice提供了这个接口。
如果我在客户端封装一个函数 UserInfo getAllUserInfoList();用上面文档上提供的方法肯定行不通。所以需要把方法都封装到一个函数里面来。
由于接触network这个模块比较少,搜索过一些资料。
主要来自豆子的博客,学习之路系列http://www.devbean.net/2013/11/qt-study-road-2-access-network-4/。
里面有个链接,有详细的方法。
我的代码是,把QEventLoop放到一个线程中去执行。我先创建要给线程类。
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;
};
Cpp文件
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 = NULL;
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 != NULL)
{
connect(m_reply, SIGNAL(readyRead()), &eventLoop, SLOT(quit()));
}
eventLoop.exec();
if (timer != NULL)
{
timer->stop();
delete timer;
timer = NULL;
}
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;
}
Webservice调用的help类
#include
#include
#include
class QNetworkReply;
class QNetworkAccessManager;
class QNetworkRequest;
class NetDataListenerThread;
class BmilpWebServiceData;
/**
* @brief The WebServiceHelp class webservice调用帮助类
* @author zp
*/
class WebServiceHelp:public QObject
{
Q_OBJECT
private:
class Dispose
{
public:
~Dispose();
};
public:
static WebServiceHelp * getInstance();
public:
/**
* @brief sendGetRequest 发送Get请求
* @param urlStr url
* @param ba 返回数据
* @param timeOutms 超时时间
* @return 返回错误代码
*/
QNetworkReply::NetworkError sendGetRequest(QString urlStr, QByteArray & ba, int timeOutms=30000);
/**
* @brief sendPostRequest 发送post请求
* @param website 网址
* @param methodName 方法名称
* @param param 参数
* @param postBa post数据
* @param code 返回代码
* @param message 返回信息
* @param data 返回数据
* @param timeOutms 超时时间
* @return 返回错误代码
*/
QNetworkReply::NetworkError sendPostRequest(QString website,const QByteArray & postBa, QByteArray& retBa, int timeOutms=30000);
protected slots:
void slot_error(QNetworkReply::NetworkError code);
private:
static WebServiceHelp * serverHelp;
static WebServiceHelp::Dispose disp;
QNetworkAccessManager *manager;
QNetworkReply::NetworkError m_errCode;
private:
WebServiceHelp(QObject *parent=0);
~WebServiceHelp();
};
cpp文件
#include "WebServiceHelp.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
WebServiceHelp * WebServiceHelp::serverHelp = NULL;
WebServiceHelp::Dispose WebServiceHelp::disp;
WebServiceHelp::WebServiceHelp(QObject *parent):QObject(parent)
{
manager = new QNetworkAccessManager();
m_errCode= QNetworkReply::NoError;
}
WebServiceHelp::~WebServiceHelp()
{
manager->deleteLater();
}
WebServiceHelp *WebServiceHelp::getInstance()
{
if(serverHelp==NULL)
{
serverHelp = new WebServiceHelp();
}
return serverHelp;
}
QNetworkReply::NetworkError WebServiceHelp::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
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 = NULL;
retError = m_errCode;
m_errCode= QNetworkReply::NoError;
return retError;
}
QNetworkReply::NetworkError WebServiceHelp::sendPostRequest(QString website, const QByteArray &postBa, QByteArray &retBa, int timeOutms)
{
QString urlStr =website;
QNetworkReply::NetworkError retError = QNetworkReply::NoError;
m_errCode= QNetworkReply::NoError;
QNetworkRequest request;
QUrl url(urlStr);
request.setUrl(url);
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
request.setHeader(QNetworkRequest::ContentLengthHeader,postBa.length());
QNetworkReply *reply = manager->post(request,postBa);
connect(reply,static_cast
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 = NULL;
retError = m_errCode;
m_errCode= QNetworkReply::NoError;
return retError;
}
void WebServiceHelp::slot_error(QNetworkReply::NetworkError code)
{
m_errCode = code;
}
WebServiceHelp::Dispose::~Dispose()
{
if(WebServiceHelp::serverHelp!=NULL)
{
delete WebServiceHelp::serverHelp;
WebServiceHelp::serverHelp=NULL;
}
}
调用代码:
QStringurl="https://www.baidu.com/";
QNetworkReply::NetworkErrorret=WebServiceHelp::getInstance()->sendGetRequest(url,ba);
if(ret==QNetworkReply::NoError)
{
qDebug()<<"OK";
}
else
{
qDebug()<<"error";
}
————————————————
版权声明:本文为CSDN博主「zpbrook」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zpbrook/article/details/44833901