Qt 调用webService 接口

来源:互联网 发布:淘宝店铺滚动公告代码 编辑:程序博客网 时间:2024/06/06 18:47

一,头文件

#include <QTimer>
#include <QThread>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

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;
};
/**
 * @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=1000);
    /**
     * @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=1000);
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();
};


二,源文件

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;
}
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<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&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;
    QSslConfiguration config;
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    config.setProtocol(QSsl::TlsV1SslV3);
    request.setSslConfiguration(config);
    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<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&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;
    }
}


三,调用 

(1),get请求

QNetworkReply::NetworkError ret=WebServiceHelp::getInstance()->sendGetRequest(url,ba);
    if(ret==QNetworkReply::NoError)
    {
        return QString(ba);
    }
    else
    {
        return "NetworkError";
    }
(2) post请求
QByteArray retBa;
    QNetworkReply::NetworkError ret=WebServiceHelp::getInstance()->sendPostRequest(webSite,postBa,retBa);
    qDebug()<<"ret.errorString();"<<ret;
    if(ret==QNetworkReply::NoError)
    {
        return QString(retBa);
    }
    else
    {
        return "NetworkError";
    }


0 0
原创粉丝点击