Http交互
功能:
加载网页图片
///
/// \brief loadNetPic 加载网页图片
/// \param pix 图片
/// \param url 网页图片路径
///
static void loadNetPic(QPixmap &pix, QString url)
{
QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkRequest request;
request.setUrl(QUrl(url));
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::AnyProtocol);
config.setPeerVerifyMode(QSslSocket::VerifyNone);
request.setSslConfiguration(config);
QNetworkReply *reply = manager->get(request);
QByteArray responseData;
QEventLoop eventLoop;
QObject::connect(manager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
eventLoop.exec();
if(reply->error()!= QNetworkReply::NoError){
//处理中的错误信息
qInfo()<<"loadNetPic reply error:"<<reply->errorString();
Log_ERROR("loadNetPic reply error:%s",reply->errorString().toUtf8().data());
qInfo()<<"loadNetPic status code:"<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
Log_ERROR("loadNetPic reply status_code:%d",reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt());
}else{
responseData = reply->readAll();
pix.loadFromData(responseData);
}
reply->deleteLater();
manager->deleteLater();
}
加载网页文件
///
/// \brief loadNetFile 加载网页文件
/// \param file 文件
/// \param url 网页文件路径
///
static void loadNetFile(QFile &file, QString url)
{
QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkRequest request;
request.setUrl(QUrl(url));
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::AnyProtocol);
config.setPeerVerifyMode(QSslSocket::VerifyNone);
request.setSslConfiguration(config);
QNetworkReply *reply = manager->get(request);
QByteArray responseData;
QEventLoop eventLoop;
QObject::connect(manager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
eventLoop.exec();
if(reply->error()!= QNetworkReply::NoError){
//处理中的错误信息
qInfo()<<"loadNetFile reply error:"<<reply->errorString();
Log_ERROR("loadNetFile reply error:%s",reply->errorString().toUtf8().data());
qInfo()<<"loadNetFile status code:"<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
Log_ERROR("loadNetFile reply status_code:%d",reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt());
}else{
responseData = reply->readAll();
file.write(responseData);
}
reply->deleteLater();
manager->deleteLater();
}
通信交互:
NetWork.h
#ifndef NETHELPER_H
#define NETHELPER_H
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QHttpPart>
#include <QHttpMultiPart>
typedef void (*HttpReceiveReply)(QNetworkReply *reply);
class NetHelper : public QObject
{
Q_OBJECT
public:
explicit NetHelper(QObject *parent = 0);
// 获取支持的协议
QStringList showScheme();
// 初始化
bool init(HttpReceiveReply receiveReplyFunc);
// get请求
QNetworkReply* HttpGet(QString url);
// post请求
QNetworkReply* HttpPost(QString url, QString content);
// post请求
QNetworkReply* HttpPostMultiPart(QString url, QHttpMultiPart *multiPart);
// 获取请求对象
QNetworkRequest& GetNetworkRequest();
// 获取请求对象
QNetworkAccessManager* GetQNetworkAccessManagert();
private:
signals:
void signalDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
void signalUploadProgress(qint64 bytesSent, qint64 bytesTotal);
public slots:
//获取异步结果
void receiveReply(QNetworkReply *reply);
public slots:
private slots:
// 获取下载相关信息
void slotDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
// 获取上传相关信息
void slotUploadProgress(qint64 bytesSent, qint64 bytesTotal);
private:
/*********************************************************************
//注意: QNetworkAccessManager 将它收到的请求排入队列。 并行执行的请求数量取决于协议。
//目前,对于桌面平台上的 HTTP 协议,一个主机/端口组合并行执行 6 个请求。
***********************************************************************/
QNetworkAccessManager *networkAccessManager;
//请求对象
QNetworkRequest networkRequest;
};
#endif // NETHELPER_H
NetWork.cpp
#include "NetHelper.h"
NetHelper::NetHelper(QObject *parent) : QObject(parent)
{
}
QStringList NetHelper::showScheme()
{
QStringList list = networkAccessManager->supportedSchemes();
//qInfo() << list;
return list;
}
bool NetHelper::init(HttpReceiveReply receiveReplyFunc)
{
networkAccessManager = new QNetworkAccessManager(this);
//设置请求头
//已知头类型参见文档QNetworkRequest::KnownHeaders
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader,"application/json;charset=UTF-8");
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::AnyProtocol);
config.setPeerVerifyMode(QSslSocket::VerifyNone);
networkRequest.setSslConfiguration(config);
// //自定义类型
// networkRequest.setRawHeader("self-header","Echo");
//QNetworkAccessManager是异步的
// connect(networkAccessManager, &QNetworkAccessManager::finished, this, &NetHelper::receiveReply);
connect(networkAccessManager, &QNetworkAccessManager::finished, this, [=](QNetworkReply *reply){
receiveReplyFunc(reply);
});
return true;
}
QNetworkReply* NetHelper::HttpGet(QString url)
{
networkRequest.setUrl(QUrl(url));
//发送请求
return networkAccessManager->get(networkRequest);
}
QNetworkReply* NetHelper::HttpPost(QString url, QString content)
{
networkRequest.setUrl(QUrl(url));
//发送请求
return networkAccessManager->post(networkRequest,content.toUtf8().data());
}
QNetworkReply *NetHelper::HttpPostMultiPart(QString url, QHttpMultiPart *multiPart)
{
QNetworkRequest l_request;
l_request.setUrl(QUrl(url));
QNetworkReply *reply;
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::AnyProtocol);
config.setPeerVerifyMode(QSslSocket::VerifyNone);
l_request.setSslConfiguration(config);
reply = networkAccessManager->post(l_request,multiPart);
multiPart->setParent(reply);
return reply;
}
QNetworkRequest &NetHelper::GetNetworkRequest()
{
return networkRequest;
}
QNetworkAccessManager *NetHelper::GetQNetworkAccessManagert()
{
return networkAccessManager;
}
void NetHelper::receiveReply(QNetworkReply *reply)
{
//请求方式get、post等,对应QNetworkAccessManager的Operation枚举
//对于restful接口需要判断此枚举
qInfo()<<"operation:"<<reply->operation();
//路径
qInfo()<<"url:"<<reply->url();
//状态码
const int status_code=reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
qInfo()<<"status code:"<<status_code;
//主动调用QNetworkReply的close或者abort也会触发finished,这时状态码为0
//访问失败状态码也会为0
if(status_code==0 && reply->errorString()=="Operation canceled"){
qInfo()<<"timeout";
}
if(reply->error()!=QNetworkReply::NoError){
//处理中的错误信息
qInfo()<<"reply error:"<<reply->errorString();
}else{
//重定向
/*if (status_code == 301 || status_code == 302){
// Or the target URL if it was a redirect:
QVariant redirectionTargetUrl =reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
//qInfo() << "redirection Url is " << redirectionTargetUrl.toString();
QUrl url(redirectionTargetUrl.toString());
networkAccessManager->get(QNetworkRequest(url));
}*/
//获取响应信息并展示到ui,这里没有解析
const QByteArray reply_data=reply->readAll();
qInfo()<<"read all:"<<reply_data.data();
//解析json
/*QJsonParseError json_error;
QJsonDocument document=QJsonDocument::fromJson(reply_data, &json_error);
if (json_error.error==QJsonParseError::NoError) {
if(document.isObject()){
const QJsonObject obj=document.object();
qInfo()<<obj;
if(obj.contains("args")){
QJsonValue value=obj.value("args");
qInfo()<<value;
//QJsonValue(object, QJsonObject({"ie":"utf-8"}))
if(value.isNull()){
}
else if(value.isString()){
}
else if(value.isArray()){
QJsonArray array = value.toArray();
int size = array.size();
for(int i = 0; i < size; i++){
QJsonValue val = array[i];
if(val.isObject()){
QJsonObject objectjs2 = val.toObject();
if(objectjs2.value("devName").toString() == "USB RGB Camera"){
}
}
}
}
else if(value.isDouble()){
}
else if(value.isBool()){
}
else {
}
}
}
}else{
qInfo()<<"json error:"<<json_error.errorString();
}*/
}
reply->deleteLater();
}
void NetHelper::slotDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
qInfo() << "Download+++" << "bytesReceived:" << bytesReceived << "bytesTotal:" << bytesTotal;
}
void NetHelper::slotUploadProgress(qint64 bytesSent, qint64 bytesTotal)
{
qInfo() << "Upload---" << "bytesSent:" << bytesSent << "bytesTotal:" << bytesTotal;
}