QT HttpGet阻塞(同步)与非阻塞模式(异步)
阻塞,同步
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 | #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; }); }
其它参考:
欢迎讨论,相互学习。
cdtxw@foxmail.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2023-12-10 鸿蒙app启动远程平板报错解决方法The type of the target device does not match the deviceType configured in the config.json file of the selected module