Qt Http JSON Get-Post 代码

Target

纯Qt实现Http Get/Post协议:

  1. Block模式
  2. 支持超时取消功能
  3. 可自定义Header

Code

NetTool.h

#ifndef NETTOOL_H
#define NETTOOL_H

#include <QObject>
#include <QtNetwork>
#include <QMap>

class NetTool : public QObject
{
    
    
    Q_OBJECT
public:
    explicit NetTool(QObject *parent = nullptr);

    QByteArray Http_Get(QString strUrl, QMap<QString,QString> headers=QMap<QString,QString>(), int nTimeout_ms=9000);
    QByteArray Http_Post(QString strUrl, QByteArray bData, QMap<QString,QString> headers=QMap<QString,QString>(), int nTimeout_ms=9000);

    // Default Coding UTF8
    QJsonDocument Http_Get_JSON(QString strUrl, int nTimeout_ms=9000);
    QJsonDocument Http_Post_JSON(QString strUrl, QByteArray bData, int nTimeout_ms=9000);

    // member
    QNetworkAccessManager* m_pNetMgr;
signals:

public slots:
};

#endif // NETTOOL_H

NetTool.cpp

#include "nettool.h"

/*
 * 5.13版之后 TLS initialization failed 解决办法:
 * C:\Qt\Qt5.14.1\Tools\QtCreator\bin 下的libssl-1_1.dll 各 libcrypto-1_1.dll 拷贝到 C:\Qt\Qt5.14.1\5.14.1\mingw73_32\bin 目录下
 */
NetTool::NetTool(QObject *parent) : QObject(parent)
{
    
    
    // 对于多线程场合,需要将QNetworkAccessManager 与 QNetworkReply 放在同一线程执行
    m_pNetMgr = new QNetworkAccessManager(this);
    m_pNetMgr->setProxy(QNetworkProxy::NoProxy);
}

QByteArray NetTool::Http_Get(QString strUrl, QMap<QString,QString> headers, int nTimeout_ms)
{
    
    
    QUrl url = QUrl::fromUserInput(strUrl);

    QNetworkRequest qnr(url);
    qnr.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41");
    qnr.setRawHeader("Content-type","text/html; charset=utf-8");
    if( headers.count() > 0 ){
    
    
        foreach (QString key, headers.keys() ) {
    
    
            qnr.setRawHeader(key.toUtf8(), headers.value(key).toUtf8());
        }
    }
    // setRawHeader("Content-Type","application/json; charset=utf-8");
    // setRawHeader("Accept","application/json");
    // .setRawHeader("Authorization", "Basic YWRtaW46MTIzNDU3");

    QSslConfiguration cfg = qnr.sslConfiguration();
    cfg.setPeerVerifyMode(QSslSocket::VerifyNone);
    cfg.setProtocol(QSsl::AnyProtocol);
    qnr.setSslConfiguration(cfg);

    QNetworkReply* reply = m_pNetMgr->get(qnr);

    QEventLoop eventLoop;
    QTimer::singleShot(nTimeout_ms, reply, &QNetworkReply::abort);
    connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
    eventLoop.exec(QEventLoop::ExcludeUserInputEvents);

    // Error
    if( reply->error() != 0 ){
    
    
        qDebug()<<"HTTP Get"<<strUrl<<"Error:"<<reply->errorString();
        return QByteArray();
    }

    // Code
    QVariant code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    if( code != 200 ){
    
    
        qDebug()<<"HTTP Get "+strUrl+ "status code:"<<code;
        return QByteArray();
    }

    // OK
    QByteArray replyData = reply->readAll();
    reply->close();
    reply->deleteLater();
    reply = nullptr;

    return replyData;
}

QByteArray NetTool::Http_Post(QString strUrl, QByteArray bData, QMap<QString,QString> headers, int nTimeout_ms)
{
    
    
    QUrl url = QUrl::fromUserInput(strUrl);
    QNetworkRequest qnr(url);
    qnr.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41");
    qnr.setRawHeader("Content-type","text/html; charset=utf-8");
    if( headers.count() > 0 ){
    
    
        foreach( QString key, headers.keys() ) {
    
    
            qnr.setRawHeader(key.toUtf8(), headers.value(key).toUtf8());
        }
    }

    QSslConfiguration cfg = qnr.sslConfiguration();
    cfg.setPeerVerifyMode(QSslSocket::VerifyNone);
    cfg.setProtocol(QSsl::AnyProtocol);
    qnr.setSslConfiguration(cfg);

    QNetworkReply* reply = m_pNetMgr->post(qnr, bData);

    QEventLoop eventLoop;
    QTimer::singleShot(nTimeout_ms, reply, &QNetworkReply::abort);
    connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
    eventLoop.exec(QEventLoop::ExcludeUserInputEvents);

    // Error
    if( reply->error() != 0 ){
    
    
        qDebug()<<"HTTP Post"<<strUrl<<"Error:"<<reply->errorString();
        return QByteArray();
    }

    // Code
    QVariant code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    if( code != 200 ){
    
    
        qDebug()<<"HTTP Post "+strUrl+ "status code:"<<code;
        return QByteArray();
    }

    // OK
    QByteArray replyData = reply->readAll();
    reply->close();
    reply->deleteLater();
    reply = nullptr;

    return replyData;
}

QJsonDocument NetTool::Http_Get_JSON(QString strUrl, int nTimeout_ms)
{
    
    
    // Default coding UTF8
    QMap<QString,QString> headers;
    headers.insert("Content-Type","application/json; charset=utf-8");
    headers.insert("Accept","application/json");
    QByteArray buff = Http_Get(strUrl, headers, nTimeout_ms);
    return QJsonDocument::fromJson(buff);
}

QJsonDocument NetTool::Http_Post_JSON(QString strUrl, QByteArray bData, int nTimeout_ms)
{
    
    
    // Default coding UTF8
    QMap<QString,QString> headers;
    headers.insert("Content-Type","application/json; charset=utf-8");
    headers.insert("Accept","application/json");
    QByteArray buff = Http_Post(strUrl, bData, headers, nTimeout_ms);
    return QJsonDocument::fromJson(buff);
}

使用:

    auto val = myTool->Http_Get_JSON(ui->lineEdit->text());
    ui->textEdit->setText(QString::fromUtf8(val.toJson()));
    qDebug()<<val;

    auto val = myTool->Http_Get(ui->lineEdit->text());
    ui->textEdit->setText(QString::fromUtf8(val));
    qDebug()<<val;

猜你喜欢

转载自blog.csdn.net/bbdxf/article/details/129060619