QT HttpGet阻塞(同步)与非阻塞模式(异步)
阻塞,同步
#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

浙公网安备 33010602011771号