QT http请求数据
阅读原文时间:2023年07月11日阅读:3

1.创建一个请求类(HttpWork):

HttpWork.h头文件

#pragma once

#include
#include
#include
#include "NetWorkCookie.h"
#include

class HttpWork : public QObject
{
Q_OBJECT

public:
HttpWork(QObject *parent,bool ssl=false,bool autoDelete = true);
~HttpWork();
void get(QString url,QString token="");
void post(QString url, QByteArray param, QString token = "");
private:
QNetworkAccessManager *m_pNetworkAccessManager;
NetworkCookie* m_pCookie;
bool m_bEnabelSSl;
bool m_bAutoDelete;
private slots:
void replyFinished(QNetworkReply *reply);
signals:
void sglResponse(QString err, QString data);

};

HttpWork.cpp源文件

#include "HttpWork.h"
#include

HttpWork::HttpWork(QObject *parent, bool ssl , bool autoDelete)
: QObject(parent)
, m_bEnabelSSl(ssl)
, m_bAutoDelete(autoDelete)
{
m_pNetworkAccessManager = new QNetworkAccessManager(this);
m_pCookie = new NetworkCookie(this);
connect(m_pNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}

HttpWork::~HttpWork()
{

}

void HttpWork::get(QString url,QString token)
{
QNetworkRequest request(url);
if (!token.isEmpty()) {
request.setRawHeader("authorization", token.toStdString().c_str());;
}

request.setRawHeader("Content-Type", "application/json");  
m\_pNetworkAccessManager->get(request);  

}

void HttpWork::post(QString url, QByteArray param, QString token)
{
QNetworkRequest request(url);
if (!token.isEmpty()) {
request.setRawHeader("authorization", token.toStdString().c_str());;
}
if (m_bEnabelSSl) {
QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration();
sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
sslConfig.setProtocol(QSsl::TlsV1_2);
request.setSslConfiguration(sslConfig);
}
//设置cookie到浏览器

m\_pNetworkAccessManager->setCookieJar(m\_pCookie);  
request.setRawHeader("Content-Type", "application/json");  
request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");  
m\_pNetworkAccessManager->post(request, param);  

}

void HttpWork::replyFinished(QNetworkReply *reply)
{
int code = -;
QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if (variant.isValid()){
code = variant.toInt();
}

QString err;  
QByteArray bytes;  
if(reply->error() == QNetworkReply::NoError) {  
    QList<QNetworkCookie> cookies = m\_pCookie->getCookies();  
    for (int i = ; i < cookies.length(); i++) {  
        QNetworkCookie cookie = cookies.at(i);  
        QString name = cookie.name();  
        QString value  = cookie.value();  
    }  
    bytes = reply->readAll();

}  
else {  
    err = reply->errorString()+"statusCode:"+code;  
}  
emit sglResponse(err, QString(bytes));  
if (m\_bAutoDelete) {  
    deleteLater();  
}

}

NetworkCookie.h头文件

#pragma once

#include
#include
class NetworkCookie : public QNetworkCookieJar
{
Q_OBJECT

public:
NetworkCookie(QObject *parent);
~NetworkCookie();
QList getCookies();
void setCookies(const QList& cookieList);
};

NetworkCookie.cpp源文件

#include "NetworkCookie.h"

NetworkCookie::NetworkCookie(QObject *parent)
: QNetworkCookieJar(parent)
{
}

NetworkCookie::~NetworkCookie()
{
}

QList NetworkCookie::getCookies()
{
return QNetworkCookieJar::allCookies();
}

void NetworkCookie::setCookies(const QList& cookieList)
{
this->setAllCookies(cookieList);

}

需要http请求数据的时候调用:

void ServerAPI::login(QString address, int port, QString user, QString passwd)
{
m_sAddress = address;
m_nPort = port;
m_sUser = user;
m_sHost = QString("http%1://%2:%3").arg(m_nPort == ? "s" : "").arg(address).arg(port);

HttpWork\* worker;

worker = new HttpWork(this, m\_nPort == );

connect(worker, SIGNAL(sglResponse(QString, QString)), this, SLOT(sltOnReponseLogin(QString, QString)));  
QByteArray append = QString("type=1&account\_or\_mobile=%1&pwd\_or\_checkCode=%2").arg(user).arg(passwd).toUtf8();  
worker->post(m\_sHost + "/admin-api/v1/user-manage/login", append);

}

void ServerAPI::sltOnReponseLogin(QString err, QString data)
{
QString sErr = "";

if (err.isEmpty()) {  
    cJSON\* jsData = cJSON\_Parse(data.toStdString().c\_str());  
    if (jsData) {  
        cJSON\* pCode = cJSON\_GetObjectItem(jsData, "code");  
        cJSON\* pData = cJSON\_GetObjectItem(jsData, "data");  
        if (pCode->valueint == )  
        {  
            m\_sToken = cJSON\_GetObjectItem(pData, "token")->valuestring;  
        }  
        else {  
            cJSON\* pError = cJSON\_GetObjectItem(jsData, "error");  
            sErr = pError->valuestring;  
        }  
    }  
    cJSON\_Delete(jsData);  
}  
else {  
    sErr = err;  
}  
emit sglLoginResult(sErr.isEmpty() , sErr);  
if (sErr.isEmpty())  
{  
    QTimer::singleShot(, this, SLOT(sltLoopTimeout()));   //这是一次性定时器到了定时间隔之后只发送一次信号槽函数只处理一次。初始化时不用等1分钟更新,3秒后就更新数据,不过值调用一次  
    m\_pLoopTimer->start( \*  \* );   //1分钟更新  
    //m\_pLoopTimer->start(1000 \* 10);   //10秒更新  
}  

}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章