Qt的http交互

文章介绍了如何在C++中使用Qt的QNetworkAccessManager类进行HTTP请求,包括加载网页图片和文件,以及展示了NetHelper类的网络请求相关方法和事件处理。
摘要由CSDN通过智能技术生成

Http交互

功能:

加载网页图片
    ///
    /// \brief loadNetPic           加载网页图片
    /// \param pix                  图片
    /// \param url                  网页图片路径
    ///
    static void loadNetPic(QPixmap &pix, QString url)
{
    QNetworkAccessManager *manager = new QNetworkAccessManager();

    QNetworkRequest request;
    request.setUrl(QUrl(url));
    QSslConfiguration config = QSslConfiguration::defaultConfiguration();
    config.setProtocol(QSsl::AnyProtocol);
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    request.setSslConfiguration(config);
    QNetworkReply *reply = manager->get(request);
    QByteArray responseData;
    QEventLoop eventLoop;

    QObject::connect(manager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));

    eventLoop.exec();
    if(reply->error()!= QNetworkReply::NoError){
        //处理中的错误信息
        qInfo()<<"loadNetPic reply error:"<<reply->errorString();
        Log_ERROR("loadNetPic reply error:%s",reply->errorString().toUtf8().data());
        qInfo()<<"loadNetPic status code:"<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
        Log_ERROR("loadNetPic reply status_code:%d",reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt());
    }else{
        responseData = reply->readAll();
        pix.loadFromData(responseData);
    }
    reply->deleteLater();
    manager->deleteLater();
}

加载网页文件
    ///
    /// \brief loadNetFile          加载网页文件
    /// \param file                 文件
    /// \param url                  网页文件路径
    ///
    static void loadNetFile(QFile &file, QString url)
{
    QNetworkAccessManager *manager = new QNetworkAccessManager();

    QNetworkRequest request;
    request.setUrl(QUrl(url));
    QSslConfiguration config = QSslConfiguration::defaultConfiguration();
    config.setProtocol(QSsl::AnyProtocol);
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    request.setSslConfiguration(config);
    QNetworkReply *reply = manager->get(request);
    QByteArray responseData;
    QEventLoop eventLoop;

    QObject::connect(manager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));

    eventLoop.exec();
    if(reply->error()!= QNetworkReply::NoError){
        //处理中的错误信息
        qInfo()<<"loadNetFile reply error:"<<reply->errorString();
        Log_ERROR("loadNetFile reply error:%s",reply->errorString().toUtf8().data());
        qInfo()<<"loadNetFile status code:"<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
        Log_ERROR("loadNetFile reply status_code:%d",reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt());
    }else{
        responseData = reply->readAll();
        file.write(responseData);
    }
    reply->deleteLater();
    manager->deleteLater();
}


通信交互:

NetWork.h

#ifndef NETHELPER_H
#define NETHELPER_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QHttpPart>
#include <QHttpMultiPart>

typedef void (*HttpReceiveReply)(QNetworkReply *reply);

class NetHelper : public QObject
{
    Q_OBJECT
public:
    explicit NetHelper(QObject *parent = 0);

    // 获取支持的协议
    QStringList showScheme();
    // 初始化
    bool init(HttpReceiveReply receiveReplyFunc);
    // get请求
    QNetworkReply* HttpGet(QString url);
    // post请求
    QNetworkReply* HttpPost(QString url, QString content);
    // post请求
    QNetworkReply* HttpPostMultiPart(QString url, QHttpMultiPart *multiPart);
    // 获取请求对象
    QNetworkRequest& GetNetworkRequest();
    // 获取请求对象
    QNetworkAccessManager* GetQNetworkAccessManagert();

private:

signals:
    void signalDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
    void signalUploadProgress(qint64 bytesSent, qint64 bytesTotal);

public slots:
    //获取异步结果
    void receiveReply(QNetworkReply *reply);

public slots:


private slots:
    // 获取下载相关信息
    void slotDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);

    // 获取上传相关信息
    void slotUploadProgress(qint64 bytesSent, qint64 bytesTotal);


private:
    /*********************************************************************
    //注意: QNetworkAccessManager 将它收到的请求排入队列。 并行执行的请求数量取决于协议。
    //目前,对于桌面平台上的 HTTP 协议,一个主机/端口组合并行执行 6 个请求。
    ***********************************************************************/
    QNetworkAccessManager *networkAccessManager;
    //请求对象
    QNetworkRequest networkRequest;


};

#endif // NETHELPER_H

NetWork.cpp

#include "NetHelper.h"

NetHelper::NetHelper(QObject *parent) : QObject(parent)
{

}

QStringList NetHelper::showScheme()
{
    QStringList list = networkAccessManager->supportedSchemes();
    //qInfo() << list;
    return list;
}

bool NetHelper::init(HttpReceiveReply receiveReplyFunc)
{
    networkAccessManager = new QNetworkAccessManager(this);
    //设置请求头
    //已知头类型参见文档QNetworkRequest::KnownHeaders
    networkRequest.setHeader(QNetworkRequest::ContentTypeHeader,"application/json;charset=UTF-8");
    QSslConfiguration config = QSslConfiguration::defaultConfiguration();
    config.setProtocol(QSsl::AnyProtocol);
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    networkRequest.setSslConfiguration(config);
//    //自定义类型
//    networkRequest.setRawHeader("self-header","Echo");
    //QNetworkAccessManager是异步的
//    connect(networkAccessManager, &QNetworkAccessManager::finished, this, &NetHelper::receiveReply);
    connect(networkAccessManager, &QNetworkAccessManager::finished, this, [=](QNetworkReply *reply){
        receiveReplyFunc(reply);
    });
    return true;
}

QNetworkReply* NetHelper::HttpGet(QString url)
{
    networkRequest.setUrl(QUrl(url));

    //发送请求
    return networkAccessManager->get(networkRequest);
}

QNetworkReply* NetHelper::HttpPost(QString url, QString content)
{
    networkRequest.setUrl(QUrl(url));

    //发送请求
    return networkAccessManager->post(networkRequest,content.toUtf8().data());
}

QNetworkReply *NetHelper::HttpPostMultiPart(QString url, QHttpMultiPart *multiPart)
{
    QNetworkRequest l_request;
    l_request.setUrl(QUrl(url));
    QNetworkReply *reply;
    QSslConfiguration config = QSslConfiguration::defaultConfiguration();
    config.setProtocol(QSsl::AnyProtocol);
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    l_request.setSslConfiguration(config);
    reply = networkAccessManager->post(l_request,multiPart);
    multiPart->setParent(reply);
    return reply;
}

QNetworkRequest &NetHelper::GetNetworkRequest()
{
    return networkRequest;
}

QNetworkAccessManager *NetHelper::GetQNetworkAccessManagert()
{
    return networkAccessManager;
}


void NetHelper::receiveReply(QNetworkReply *reply)
{
    //请求方式get、post等,对应QNetworkAccessManager的Operation枚举
    //对于restful接口需要判断此枚举
    qInfo()<<"operation:"<<reply->operation();
    //路径
    qInfo()<<"url:"<<reply->url();
    //状态码
    const int status_code=reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    qInfo()<<"status code:"<<status_code;
    //主动调用QNetworkReply的close或者abort也会触发finished,这时状态码为0
    //访问失败状态码也会为0
    if(status_code==0 && reply->errorString()=="Operation canceled"){
        qInfo()<<"timeout";
    }

    if(reply->error()!=QNetworkReply::NoError){
        //处理中的错误信息
        qInfo()<<"reply error:"<<reply->errorString();
    }else{
        //重定向
        /*if (status_code == 301 || status_code == 302){
              // Or the target URL if it was a redirect:
              QVariant redirectionTargetUrl =reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
              //qInfo() << "redirection Url is " << redirectionTargetUrl.toString();
              QUrl url(redirectionTargetUrl.toString());
              networkAccessManager->get(QNetworkRequest(url));
        }*/

        //获取响应信息并展示到ui,这里没有解析
        const QByteArray reply_data=reply->readAll();

        qInfo()<<"read all:"<<reply_data.data();

        //解析json
        /*QJsonParseError json_error;
        QJsonDocument document=QJsonDocument::fromJson(reply_data, &json_error);
        if (json_error.error==QJsonParseError::NoError) {
            if(document.isObject()){
                const QJsonObject obj=document.object();
                qInfo()<<obj;
                if(obj.contains("args")){
                    QJsonValue value=obj.value("args");
                    qInfo()<<value;
                    //QJsonValue(object, QJsonObject({"ie":"utf-8"}))
                    if(value.isNull()){
                    }
                    else if(value.isString()){
                    }
                    else if(value.isArray()){
                        QJsonArray array = value.toArray();
                        int size = array.size();
                        for(int i = 0; i < size; i++){
                            QJsonValue val = array[i];
                            if(val.isObject()){
                                QJsonObject objectjs2 = val.toObject();
                                if(objectjs2.value("devName").toString() == "USB RGB Camera"){
                                }
                            }
                        }

                    }
                    else if(value.isDouble()){
                    }
                    else if(value.isBool()){
                    }
                    else {
                    }
                }
            }
        }else{
            qInfo()<<"json error:"<<json_error.errorString();
        }*/
    }
    reply->deleteLater();
}

void NetHelper::slotDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
    qInfo() << "Download+++" << "bytesReceived:" << bytesReceived << "bytesTotal:" << bytesTotal;
}

void NetHelper::slotUploadProgress(qint64 bytesSent, qint64 bytesTotal)
{
    qInfo() << "Upload---" << "bytesSent:" << bytesSent << "bytesTotal:" << bytesTotal;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值