全屏 被埋没的画家

用QT实现同步调用WebService

标签:转载 作者:zpbrook

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(&QNetworkReply::error),this,&WebServiceHelp::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 = 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(&QNetworkReply::error),this,&WebServiceHelp::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 = 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