QNetworkAccessManager、QNetworkRequest和QNetworkReply与http通讯
admin
2024-03-24 02:44:05
0

QNetworkAccessManager、QNetworkRequest和QNetworkReply三者关系:
QNetworkAccessManager是主体,它负责发送和接收,也就是get和post,并且他还能判断网络连接状态,通过networkSessionConnected信号判断。
QNetworkRequest是请求,它是要访问的内容,并且它也能对这些内容进行配置,它放在QNetworkAccessManager的get和post中使用。
QNetworkReply它是回复,即返回结果,它能获取到get,post后得到的结果,包括正常的和异常的。
拓展:QSslConfiguration它是QNetworkRequest的一个访问设置类,如下设置协议类型支持https:

  QNetworkRequest req(url);QSslConfiguration config;config.setPeerVerifyMode(QSslSocket::VerifyNone);config.setProtocol(QSsl::AnyProtocol);req.setSslConfiguration(config);

QNetworkRequest可以通过设置head来设置发送类型的格式,如下:
字符串模式:

  req.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/x-www-form-urlencoded"));

json模式:

  req.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));

这里简单介绍下QNetworkAccessManager的get和post,它们都是访问服务器,但是get一般是不带参数的,post一般会有参数的。当然get也可以带参数,例如QNetworkRequest设置的url里面带有参数,例如这种格式:http://testurl?id=666&name=“xiaoming”;

QNetworkReply作为获取返回值和获取连接状态来使用,它可以同步获取,也可以异步获取。
同步获取:使用QEventloop来做一个非阻塞延时。
异步获取:通过关联信号readyRead来获取。
同步访问后台使用实例:
.h

#ifndef HTTPCLIENT_H
#define HTTPCLIENT_H#include 
#include class HttpClient : public QObject {Q_OBJECT
public:HttpClient(QObject *parent = 0);QByteArray get(const QString &url, int timeout);QByteArray post(const QString &url, const QByteArray &data, int timeout);QByteArray posttojson(const QString &url, const QByteArray &data, int timeout);
private slots:void replyFinished(QNetworkReply *reply);protected:QByteArray request(QNetworkReply *reply, int timeout);private:QNetworkAccessManager *m_manager;QString m_recvData;
};#endif // HTTPCLIENT_H

cpp:

#include "httpclient.h"
#include 
#include 
#include 
#include 
#include 
#include 
#define HTTP_HEADER_KEY       "X-Version"
#define HTTP_HEADER_VALUE       "1.0"HttpClient::HttpClient(QObject *parent) : QObject(parent) {m_recvData = "";m_manager = new QNetworkAccessManager(this);connect(m_manager, SIGNAL(finished(QNetworkReply *)), this,SLOT(replyFinished(QNetworkReply *)));
}QByteArray HttpClient::get(const QString &url, int timeout) {QNetworkRequest req(url);//下边的四行代码是做验证处理的,方式不止这一种QSslConfiguration config;config.setPeerVerifyMode(QSslSocket::VerifyNone);config.setProtocol(QSsl::AnyProtocol);req.setSslConfiguration(config);req.setRawHeader(HTTP_HEADER_KEY,HTTP_HEADER_VALUE);req.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/x-www-form-urlencoded"));return request(m_manager->get(req), timeout);
}QByteArray HttpClient::post(const QString &url, const QByteArray &data,int timeout) {QNetworkRequest req(url);//下边的四行代码是做验证处理的,方式不止这一种QSslConfiguration config;config.setPeerVerifyMode(QSslSocket::VerifyNone);config.setProtocol(QSsl::AnyProtocol);req.setSslConfiguration(config);req.setRawHeader(HTTP_HEADER_KEY,HTTP_HEADER_VALUE);req.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/x-www-form-urlencoded"));return request(m_manager->post(req, data), timeout);
}QByteArray HttpClient::posttojson(const QString &url, const QByteArray &data,int timeout) {QNetworkRequest req(url);//下边的四行代码是做验证处理的,方式不止这一种QSslConfiguration config;config.setPeerVerifyMode(QSslSocket::VerifyNone);config.setProtocol(QSsl::AnyProtocol);req.setSslConfiguration(config);req.setRawHeader(HTTP_HEADER_KEY,HTTP_HEADER_VALUE);req.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));return request(m_manager->post(req, data), timeout);
}void HttpClient::replyFinished(QNetworkReply *reply) {QVariant status_code =reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);QByteArray bytes = reply->readAll();QTextCodec *pCodec = QTextCodec::codecForName("UTF-8");m_recvData = pCodec->toUnicode(bytes);if (reply->error() != QNetworkReply::NoError) {qWarning() << "http通信返回错误" <url()<deleteLater(); //要删除reply,要调用deletelater;
}QByteArray HttpClient::request(QNetworkReply *reply, int timeout) {QEventLoop loop;QTimer timer;connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));timer.start(timeout);loop.exec();return m_recvData.toUtf8();
}

从服务器下载文件实例:
.h

#ifndef HTTPDOWNLOADBUSSSINESS_H
#define HTTPDOWNLOADBUSSSINESS_H#include #include 
#include 
#include class Reply;class HttpDownloadBussiness : public QObject {Q_OBJECT
public:HttpDownloadBussiness (QString url,QString fileName,QObject *parent = 0);//  bool getRunningStatus() const;
public slots:bool download();//  bool stopDownload(QString url);public slots:void handleFinished();void handleReadyRead();void updateDownloadProgress(qint64, qint64);void handleError(QNetworkReply::NetworkError error);private:bool raiseFailed();void raiseCompleted();//  void raiseStop();
signals:void progressChangedSig(quint64 p, quint64 t);void downloadCompletedSig();void downloadFailedSig();//  void downloadStopSig();private:QNetworkAccessManager *m_manager;QNetworkReply *m_netReply;Reply *m_reply;quint64 m_total;bool m_isRunning;QFile *m_file;QUrl m_url;QString m_fileTemp;qint64 m_existSize;//  bool m_isStop;
};class Reply : public QObject {Q_OBJECTpublic:Reply(QNetworkReply *reply);enum { Head, Get };int method() const { return m_method; }void setMethod(int method) { m_method = method; }void abort() { m_reply->abort(); }QVariant header(QNetworkRequest::KnownHeaders header) const {return m_reply->header(header);}QNetworkReply *reply() const { return m_reply; }quint64 current;
signals:void finished();void errorOccurred(QNetworkReply::NetworkError);void readyRead();void updateDownloadProgress(qint64, qint64);private:QNetworkReply *m_reply;int m_method;
};#endif // HTTPDOWNLOADBUSSSINESS_H

.cpp

#include "httpdownloadbussiness.h"
#include 
#include 
#include 
#include 
#include HttpDownloadBussiness ::HttpDownloadBussiness(QString url,QString fileName,QObject *parent) : QObject(parent) {m_isRunning = false;m_url = QUrl(url);m_fileTemp = fileName + "_tmp";//    m_isStop = false;}bool HttpDownloadBussiness ::download() {m_manager = new QNetworkAccessManager;m_isRunning = true;m_existSize = 0;m_file = new QFile(m_fileTemp, this);if (!m_file->open(QFile::WriteOnly | QIODevice::Append)) {raiseFailed();return false;}QNetworkRequest req(m_url);//下边的四行代码是做验证处理的,方式不止这一种QSslConfiguration config;config.setPeerVerifyMode(QSslSocket::VerifyNone);config.setProtocol(QSsl::AnyProtocol);req.setSslConfiguration(config);QNetworkAccessManager *accessManager = new QNetworkAccessManager(this);qDebug() << "当前支持协议:"<supportedSchemes();//    req.setRawHeader("Range", pos.toLatin1());//  if (m_manager->networkAccessible() == QNetworkAccessManager::NotAccessible) {//    m_manager->setNetworkAccessible(QNetworkAccessManager::Accessible);//  }m_reply = new Reply(m_manager->get(req));m_reply->current = 0;qWarning() << QString::fromUtf8("%1文件开始下载...").arg(m_fileTemp)<reply()->abort();if (m_reply)m_reply->reply()->deleteLater();m_isStop = true;}}emit downloadStopSig();return true;}return false;
}bool HttpDownloadBussiness ::getRunningStatus() const { return m_isRunning; }
#endifvoid HttpDownloadBussiness ::handleFinished() {if (m_isRunning){//        m_isStop = true;m_file->close();int index = m_fileTemp.lastIndexOf("_tmp");QString realName = m_fileTemp.left(index);bool ok = QFile::rename(m_fileTemp, realName);qWarning() <<__FUNCTION__ << __LINE__<(sender());QByteArray content = reply->reply()->readAll();m_file->seek(reply->current);m_file->write(content);reply->current += content.length();
}void HttpDownloadBussiness ::updateDownloadProgress(qint64 part, qint64 total) {
//    qDebug()<close();//暂时屏蔽该代码,使用恢复下载超时处理,if (!QFile::remove(m_file->fileName())) {qDebug() << "remove failed";}}emit downloadFailedSig();
}bool HttpDownloadBussiness ::raiseFailed() {m_isRunning = false;m_file->close();if (!QFile::remove(m_file->fileName())) {qDebug() << "create remove failed";}emit downloadFailedSig();return false;
}void HttpDownloadBussiness ::raiseCompleted() {m_isRunning = false;connect(m_manager, SIGNAL(finished(QNetworkReply *)), m_manager,SLOT(deleteLater()));emit downloadCompletedSig();
}#if 0
void HttpDownloadBussiness ::raiseStop() { emit downloadStopSig(); }
#endifReply::Reply(QNetworkReply *reply) {m_reply = reply;qRegisterMetaType("QNetworkReply::NetworkError");connect(m_reply, SIGNAL(finished()), this, SIGNAL(finished()));connect(m_reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), this,SIGNAL(errorOccurred(QNetworkReply::NetworkError)));connect(m_reply, SIGNAL(readyRead()), this, SIGNAL(readyRead()));connect(m_reply, SIGNAL(downloadProgress(qint64, qint64)), this,SIGNAL(updateDownloadProgress(qint64, qint64)));
}

相关内容

热门资讯

怎么解除订阅安卓系统,安卓系统... 你是不是也和我一样,手机里订阅了好多服务,结果现在想解除订阅,却一头雾水?别急,今天就来手把手教你如...
安卓系统停用怎么开启,轻松恢复... 亲爱的手机控们,你是否曾经遇到过安卓系统突然停用的情况,让你手忙脚乱,不知所措?别担心,今天就来教你...
安卓系统电池健康度,电池健康度... 你有没有发现,你的安卓手机最近是不是有点儿不给力了?电池续航能力大不如前,充电速度也慢了不少?别急,...
安卓系统按键怎么截图,安卓系统... 你是不是也和我一样,有时候想截个图分享给朋友,却发现安卓手机的截图功能有点神秘呢?别急,今天就来手把...
购票系统安卓源代码,架构设计与... 你有没有想过,那些我们每天离不开的购票系统,它们背后的秘密是什么呢?今天,就让我带你一探究竟,揭开购...
安卓手机系统后台测试,深度解析... 你有没有发现,你的安卓手机后台总是悄悄地忙碌着?别小看了这些后台程序,它们可是手机系统稳定运行的关键...
安卓系统重启的图标,解锁设备新... 手机突然重启,是不是心里有点慌?别急,今天就来和你聊聊安卓系统重启的图标,让你一眼就能认出它,再也不...
车载智慧屏安卓系统,智能出行新... 你有没有发现,现在的车载智慧屏越来越智能了?尤其是那些搭载了安卓系统的,简直就像是个移动的小电脑,不...
安卓系统连上网权限,解锁设备无... 你有没有发现,你的安卓手机里有些应用总是偷偷连上网?别小看这个小小的网络权限,它可是能影响你隐私、消...
安卓谷歌操作系统,探索安卓谷歌... 你知道吗?在智能手机的世界里,有一个操作系统可是无人不知、无人不晓,那就是安卓谷歌操作系统。它就像一...
安卓系统手写%怎样调出,具体实... 你有没有遇到过这种情况:在使用安卓手机的时候,突然想用手写输入法来记录一些灵感或者重要信息,可是怎么...
安卓手机重置 系统设置,轻松恢... 手机用久了是不是感觉卡顿得厉害?别急,今天就来教你怎么给安卓手机来个大变身——重置系统设置!想象你的...
win如何安装安卓系统,Win... 哇,你有没有想过,让你的Win系统也能玩转安卓应用?没错,就是那种在手机上轻松自如的安卓系统,现在也...
苹果qq和安卓系统,跨平台体验... 你有没有发现,现在手机市场上,苹果和安卓的较量可是越来越激烈了呢!咱们就来聊聊这个话题,看看苹果QQ...
显示最好的安卓系统,探索最新旗... 你有没有想过,为什么安卓系统那么受欢迎呢?它就像一个魔法盒子,里面装满了各种神奇的魔法。今天,就让我...
安卓app怎么降级系统,系统版... 你有没有发现,有时候安卓手机的系统更新后,新功能虽然炫酷,但老系统用起来更顺手呢?别急,今天就来教你...
雷军脱离安卓系统,引领科技变革... 你知道吗?最近科技圈可是炸开了锅,因为我们的雷军大大竟然宣布要脱离安卓系统,这可真是让人大跌眼镜啊!...
安卓系统自动开网络,安卓系统自... 你有没有发现,手机里的安卓系统有时候会自动开启网络连接,这可真是让人又爱又恨啊!有时候,你正专心致志...
安卓系统怎样控制后台,因为服务... 手机里的安卓系统是不是感觉越来越卡了?后台程序太多,不仅耗电还影响性能。别急,今天就来教你怎么巧妙地...
安卓系统打游戏推荐,一触即达! 你有没有发现,现在手机游戏越来越好玩了?不管是休闲小游戏还是大型MMORPG,都能在手机上畅玩。但是...