QT管理网络状态和网络连接

 

参考:http://www.cleartechfei.com/2020/07/qt%E4%BD%BF%E7%94%A8http%E5%8D%8F%E8%AE%AE/

1. 用Qt框架进行应用开发的过程中,很多时候需要进行客户端与服务端的网络通信,需要Qt的internet模块。而网络通信中最常用的协议就是http协议,Qt对http协议的调用进行了封装,使用非常方便。在这总结一下常用的http请求。

  使用internet模块时需要在pro文件中添加对应的模块。

  QT += network

 2. Qt中使用Http协议与服务端通信的请求主要分为GET和POST,GET是从指定的资源请求数据,而POST是向指定的资源提交要被处理的数据。

  常用的请求类型包括五类:

      2.1.  多个独立参数GET请求
      2.2.  参数数组GET请求
      2.3.  上传参数数据POST请求
      2.4.  上传参数和文件POST请求
      2.5.  下载文件GET请求

  2.1 多个独立参数GET请求

 1 int NormalGetRequest(QString paramer1, QString paramer2)
 2 {
 3     //生成对应的网络请求
 4     QNetworkRequest request;
 5     QString scheme = "http";
 6     QString serverAddr = "192.168.0.1";
 7     QString port = "80";
 8     QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
 9     QString fullRequest = requestHeader + QString("/api/vi/user/getrequest?paramer1=%1&paramer2=%2").arg(paramer1).arg(paramer2);
10     request.setUrl(QUrl(fullRequest));
11 
12     //发送Get请求
13     QNetworkAccessManager manager;
14     QNetworkReply *reply = manager.get(request);
15     QEventLoop eventLoop;
16     QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
17     eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
18 
19     //对请求的返回异常进行处理
20     if(reply->error() != QNetworkReply::NoError)
21     {
22         return reply->error();
23     }
24 
25     //解析返回的Json结果
26     QByteArray replyData = reply->readAll();
27     QJsonParseError json_error;
28     QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
29     if(json_error.error != QJsonParseError::NoError)
30     {
31         return -1;
32     }
33     QJsonObject rootObj = jsonDoc.object();
34     QString codeStr = rootObj.value("code").toString();
35     if (codeStr.compare("200") == 0)
36     {
37         //返回代码为200的时候证明请求成功对包含的结构数据进行处理
38         if(rootObj.contains("result"))
39         {
40 
41         }
42         return 0;
43     }
44     else
45     {
46         //请求失败对对应的处理
47         return codeStr.toInt();
48     }
49 }

 

  2.2 参数数组GET请求

 1 int GetRequestWithArray(QVector<QString> m_filePathVector)
 2 {
 3     QJsonArray array;
 4     for(int index=0; index<m_filePathVector.size(); ++index)
 5     {
 6         QJsonObject object;
 7         object.insert("index",QString::number(index));
 8         object.insert("path",m_filePathVector.at(index));
 9         array.append(object);
10     }
11 
12     QJsonDocument document;
13     document.setArray(array);
14     QString arrayString = document.toJson(QJsonDocument::Compact);
15 
16     //生成对应的网络请求
17     QNetworkRequest request;
18     QString scheme = "http";
19     QString serverAddr = "192.168.0.1";
20     QString port = "80";
21     QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
22     QString fullRequest = requestHeader + QString("/api/vi/user/getarray?paramers=%1").arg(arrayString);
23     request.setUrl(QUrl(fullRequest));
24 
25     //获取错误
26     QNetworkAccessManager manager;
27     QNetworkReply *reply = manager.get(request);
28     QEventLoop eventLoop;
29     QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
30     eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
31     if(reply->error() != QNetworkReply::NoError)
32     {
33         return reply->error();
34     }
35 
36     //解析返回的Json结果
37     QByteArray replyData = reply->readAll();
38     QJsonParseError json_error;
39     QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
40     if(json_error.error != QJsonParseError::NoError)
41     {
42         return -1;
43     }
44     QJsonObject rootObj = jsonDoc.object();
45     QString codeStr = rootObj.value("code").toString();
46     if (codeStr.compare("200") == 0)
47     {
48         //返回代码为200的时候证明请求成功对包含的结构数据进行处理
49         if(rootObj.contains("result"))
50         {
51 
52         }
53         return 0;
54     }
55     else
56     {
57         //请求失败对对应的处理
58         return codeStr.toInt();
59     }
60 }

  2.3 上传参数数据POST请求

 1 int NormalPostRequest(QString paramer1, QString paramer2)
 2 {
 3     //生成对应的网址请求
 4     QNetworkRequest request;
 5     QString scheme = "http";
 6     QString serverAddr = "192.168.0.1";
 7     QString port = "80";
 8     QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
 9     QString fullRequest = requestHeader + "/api/v1/user/postrequest";
10     request.setUrl(QUrl(fullRequest));
11     request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
12 
13     //获取对应的参数数据
14     QByteArray data;
15     data.append("paramer1=");
16     data.append(paramer1.toUtf8());
17     data.append("&paramer2=");
18     data.append(paramer2.toUtf8());
19 
20     //发送请求
21     QNetworkAccessManager manager;
22     QNetworkReply *reply = manager.post(request,data);
23     QEventLoop eventLoop;
24     QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
25     eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
26     if(reply->error() != QNetworkReply::NoError)
27     {
28         return reply->error();
29     }
30 
31 
32     //解析返回的Json结果
33     QByteArray replyData = reply->readAll();
34     QJsonParseError json_error;
35     QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
36     if(json_error.error != QJsonParseError::NoError)
37     {
38         return -1;
39     }
40     QJsonObject rootObj = jsonDoc.object();
41     QString codeStr = rootObj.value("code").toString();
42     if (codeStr.compare("200") == 0)
43     {
44         //返回代码为200的时候证明请求成功对包含的结构数据进行处理
45         if(rootObj.contains("result"))
46         {
47 
48         }
49         return 0;
50     }
51     else
52     {
53         //请求失败对对应的处理
54         return codeStr.toInt();
55     }
56 }

  2.4 上传参数和文件POST请求

 

 1 int PostRequestWithFile(QString paramer1, QString paramer2,QString filePath)
 2 {
 3 
 4     //生成对应的网址请求
 5     QFileInfo fileInfo(filePath);
 6     QString fileName =fileInfo.fileName();
 7 
 8     QFile* inputFile = new QFile(filePath);
 9     inputFile->open(QIODevice::ReadOnly);
10 
11     //multipart请求
12     QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
13     //文件块
14     QHttpPart filePart;
15     filePart.setHeader(QNetworkRequest::ContentDispositionHeader,
16                                  QVariant(QString("form-data; name="uploadfile";filename="%1"").arg(fileName)));
17     filePart.setBodyDevice(inputFile);
18     inputFile->setParent(multiPart);
19     multiPart->append(filePart);
20 
21     QHttpPart paramer1Part;
22     paramer1Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name="paramer1""));
23     paramer1Part.setBody(paramer1.toUtf8());
24     multiPart->append(paramer1Part);
25 
26     QHttpPart paramer2Part;
27     paramer2Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name="paramer2""));
28     paramer2Part.setBody(paramer2.toUtf8());
29     multiPart->append(paramer2Part);
30 
31 
32     //生成对应的网址请求
33     QNetworkRequest request;
34     QString scheme = "http";
35     QString serverAddr = "192.168.0.1";
36     QString port = "80";
37     QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
38     QString fullRequest = requestHeader + "/api/v1/user/postrequestwithfile";
39     request.setUrl(QUrl(fullRequest));
40 
41     //发送请求
42     QNetworkAccessManager manager;
43     QNetworkReply *reply = manager.post(request,multiPart);
44     multiPart->setParent(reply);
45 
46     QEventLoop eventLoop;
47     QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)),&eventLoop, SLOT(quit()));
48     eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
49 
50     if(reply->error() != QNetworkReply::NoError)
51     {
52         return reply->error();
53     }
54 
55     //解析返回的Json结果
56     QByteArray replyData = reply->readAll();
57     QJsonParseError json_error;
58     QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
59     if(json_error.error != QJsonParseError::NoError)
60     {
61         return -1;
62     }
63     QJsonObject rootObj = jsonDoc.object();
64     QString codeStr = rootObj.value("code").toString();
65     if (codeStr.compare("200") == 0)
66     {
67         //返回代码为200的时候证明请求成功对包含的结构数据进行处理
68         if(rootObj.contains("result"))
69         {
70 
71         }
72         return 0;
73     }
74     else
75     {
76         //请求失败对对应的处理
77         return codeStr.toInt();
78     }
79 }

  2.5 下载文件GET请求

 

 1 int DownloadFileFromWeb(QString fileUrl,QString&fileSavePath)
 2 {
 3     QNetworkRequest request;
 4     QUrl url(fileUrl);
 5     QFileInfo fileInfo(url.path());
 6     QString fileName = fileInfo.fileName();
 7     QNetworkAccessManager *accessManager=new QNetworkAccessManager();
 8     request.setUrl(url);
 9     QNetworkReply *reply  = accessManager->get(request);
10     QEventLoop loop;
11     QObject::connect(accessManager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));
12 //如果需要下载进度需要关联对应的信号
13 //connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(LoadProgress(qint64, qint64)));
14     loop.exec(QEventLoop::ExcludeUserInputEvents);
15 
16     //获取下载返回值
17     QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
18     if (statusCode.toInt() != 200)
19     {
20         return -1;
21     }
22 
23     //保存下载的文件
24     QFile file(fileSavePath);
25     if(!file.open(QIODevice::WriteOnly))
26     {
27         return -2;
28     }
29     file.write(reply->readAll());
30     file.close();
31     return 0;
32 }

 

posted @ 2022-10-26 14:16  GeraldG  阅读(208)  评论(0编辑  收藏  举报