• Qt http get请求数据阻塞和非阻塞实现源码


    一、阻塞方式

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    QString HttpHelper::httpRequestBlock(const QString contentType, const QString url)
    {
        static QMutex mutex;
        QMutexLocker locker(&mutex);
        QDateTime startTime = QDateTime::currentDateTime(); // 当前时间
        //生成对应的网络请求
        QNetworkRequest request;
        request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(contentType)); // 设置Content-Type为application/json
        request.setUrl(QUrl(url));
    
        //发送Get请求
        QNetworkAccessManager manager;
        QNetworkReply *reply = manager.get(request);
        QEventLoop eventLoop;
        QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
        eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
    
        //对请求的返回异常进行处理
        if(reply->error() != QNetworkReply::NoError)
        {
            qDebug()<< reply->error();
            delete reply;
            return "";
        }
    
        //解析返回的Json结果
        QByteArray replyData = reply->readAll();
        QString res = QString(replyData);
        delete reply;
        QDateTime endTime = QDateTime::currentDateTime(); // 结束时间
        qDebug()<<"http request time:"<< startTime.msecsTo(endTime); // 毫秒差值
    
        return res;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    二、非阻塞方式

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    void HttpHelper::httpRequestNoBlockSlot(const QString contentType, const QString url, uint16_t timeout)
    {
        this->httpResult.clear();
        this->networkAccessManager->setTransferTimeout(timeout);
    
    
        //发送异步get请求
        QNetworkRequest request;
        request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(contentType)); // 设置Content-Type为application/json
        request.setUrl(QUrl(url));
        QNetworkReply *reply = this->networkAccessManager->get(request);
    
        connect(reply, &QNetworkReply::finished,
                [=]()
                {
                    if(reply->error()!=QNetworkReply::NoError)
                    {
                        //处理中的错误信息
                        qDebug()<<"reply error:"<<reply->errorString();
                        qDebug()<<"status code:"<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
                    }
                    else
                    {
                        //请求方式
    //                    qDebug()<<"operation:"<operation();
    //                    //状态码
    //                    qDebug()<<"status code:"<attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    //                    qDebug()<<"url:"<url();
    //                    //qDebug()<<"raw header:"<rawHeaderList();
    
                        //获取响应信息
                        QByteArray replyData = reply->readAll();
                        this->httpResult = QString(replyData);
    
                    }
                    delete reply;
                });
    
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
  • 相关阅读:
    Dataworks API:调取 MC 项目下所有表单
    内存对齐规则
    LeetCode第9题:回文数
    聊聊秒杀系统的设计(四)
    LeetCode 1113.报告的记录
    【机器学习】带你轻松理解什么是强化学习中的状态动作函数 ?
    微信开放平台第三方开发,实现代小程序备案申请
    【工具流】WSL2安装
    2.Swift Tabbar的使用
    Java宝典-抽象类和接口
  • 原文地址:https://blog.csdn.net/qq_15181569/article/details/134295664