qt http封装

api.h

#ifndef API_H
#define API_H
typedef void (*ReqCallBack)(QByteArray data);//声明函数指针类型
#define BASE_URI "http://192.168.110.169:6801/hikari-cloud"
#endif // API_H

HttpClient.h

#ifndef HTTPCLIENT_H
#define HTTPCLIENT_H
#include <QMap>
#include <QObject>
#include "utils/api.h"
class HttpClient : public QObject {
    
    
    Q_OBJECT

public:
    static HttpClient& getInstance()
    {
    
    
        static HttpClient instance;
        return instance;
    }
    void reqGet(QString endUrl,QMap<QString,QString> paramMap,ReqCallBack reqCallBack);

private:
    HttpClient();
    HttpClient(const HttpClient&){
    
    }
    HttpClient& operator==(const HttpClient&){
    
    }
};


#endif // HTTPCLIENT_H


HttpClient.cpp

#include "HttpClient.h"
#include "utils/HttpThread.h"

HttpClient::HttpClient(){
    
    

}
void HttpClient::reqGet(QString endUrl,QMap<QString,QString> paramMap,ReqCallBack reqCallBack){
    
    
    HttpThread* httpThread=new HttpThread();
    httpThread->mParamMap=paramMap;
    httpThread->mEndUrl=endUrl;
    httpThread->mReqCallBack=reqCallBack;
    httpThread->start();
}

HttpThread.h

#ifndef HTTPTHREAD_H
#define HTTPTHREAD_H
#include <QMap>
#include <QThread>
#include "utils/api.h"

class HttpThread : public QThread{
    
    
    Q_OBJECT

public:
    QMap<QString,QString> mParamMap;
    QString mEndUrl;

    ReqCallBack mReqCallBack;


private:
    void run();
};
#endif // HTTPTHREAD_H

HttpThread.cpp

#include "HttpThread.h"
#include <QDebug>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QDebug>
#include "utils/api.h"
#include <QEventLoop>
#include <QFuture>
#include <QtConcurrentRun>
#include <QMap>

void HttpThread::run()
{
    
    
    qDebug()<<"HttpThread  :  "<<QThread::currentThread();
    QNetworkAccessManager* netAccessManager= new QNetworkAccessManager;
    QString reqUrlStr=BASE_URI+this->mEndUrl;
    QUrl reqUrl =reqUrlStr;
    QMap<QString, QString>::const_iterator iterator;
    for( iterator=mParamMap.constBegin(); iterator!=mParamMap.constEnd(); ++iterator){
    
    
        qDebug() << iterator.key() <<"        " <<iterator.value();
        reqUrl.addQueryItem( iterator.key(),iterator.value());
    }
    qDebug()<<"url:"<<reqUrl;
    QNetworkRequest request;
    request.setRawHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    request.setUrl(reqUrl);
    QNetworkReply *reply =  netAccessManager->get(request);
    /* 等待请求返回结果 */
    QEventLoop loop;
    connect(netAccessManager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));//finish为manager自带的信号,replyFinished是自定义的
    loop.exec();
    if (reply->error() == QNetworkReply::NoError){
    
    
        QByteArray recData = reply->readAll();
        this->mReqCallBack(recData);
        qDebug()<<"req success:" << recData;
    }else {
    
    
        qDebug()<<"req error";
    }


    /* 释放 reply 内存, 否则会造成内存泄漏 */
    reply->deleteLater();
    reply=NULL;
}


调用

    HttpClient::getInstance().reqGet("/test/fun1",map,[=](QByteArray recData) mutable{
    
    
//        qDebug("====回调成功的数据======");
        qDebug()<<"call back data========:" << recData;
    });

Guess you like

Origin blog.csdn.net/qq_25430563/article/details/121179592