Qt http get请求数据阻塞和非阻塞实现源码
  p2dF89NsnfQB 2023年12月06日 31 0


一、阻塞方式

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QJsonParseError>
#include <QJsonObject>
#include <QTime>
#include <QEventLoop>
#include <QMutex>

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;
}

二、非阻塞方式

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QJsonParseError>
#include <QJsonObject>
#include <QTime>
#include <QEventLoop>
#include <QMutex>

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:"<<reply->operation();
//                    //状态码
//                    qDebug()<<"status code:"<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
//                    qDebug()<<"url:"<<reply->url();
//                    //qDebug()<<"raw header:"<<reply->rawHeaderList();

                    //获取响应信息
                    QByteArray replyData = reply->readAll();
                    this->httpResult = QString(replyData);

                }
                delete reply;
            });

}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月06日 0

暂无评论

推荐阅读
p2dF89NsnfQB