参考: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 }

QT管理网络状态和网络连接的更多相关文章

  1. iOS网络4——Reachability检测网络状态

    一.整体介绍 前面已经介绍了网络访问的NSURLSession.NSURLConnection,还有网页加载有关的webview,基本满足通常的网络相关的开发. 其实在网络开发中还有比较常用的就是网络 ...

  2. iOS Reachability检测网络状态

    一.整体介绍 前面已经介绍了网络访问的NSURLSession.NSURLConnection,还有网页加载有关的webview,基本满足通常的网络相关的开发.其实在网络开发中还有比较常用的就是网络状 ...

  3. iOS开发系列-网络状态监控

    概述 在网络应用中,需要对用户设别的网络状态进行实时监控,可以让用户了解自己的网络状态出现网络问题提示用户. 一般在网络状态不好的场景下需要做一些处理比如: WIFT/3G/4G网络:自动下载高清图. ...

  4. [React Native]获取网络状态

    使用React Native,可以使用NetInfo API获取手机当前的各个网络状态. componentWillMount() { NetInfo.fetch().done((status)=&g ...

  5. .Neter玩转Linux系列之五:crontab使用详解和Linux的进程管理以及网络状态监控

    一.crontab使用详解 概述:任务调度:是指系统在某个时间执行的特定的命令或程序. 任务调度分类: (1)系统工作:有些重要的工作必须周而 复始地执行. (2)个别用户工作:个别用户可能希望执 行 ...

  6. DOS命令行(6)——Windows网络状态及用户管理

    ipconfig --查看计算机中适配器的TCP/IP配置信息 命令格式: ipconfig [/allcompartments] [/? | /all | /renew [adapter] | /r ...

  7. IOS(SystemConfiguration)框架中关于测试连接网络状态相关方法

    1. 在SystemConfiguration.famework中提供和联网相关的function, 可用来检查网络连接状态. 2. SC(SystemConfiguration)框架中关于测试连接网 ...

  8. iOS开发 - Swift实现检测网络连接状态及网络类型

    一.前言 在移动开发中,检测网络的连接状态尤其检测网络的类型尤为重要.本文将介绍在iOS开发中,如何使用Swift检测网络连接状态及网络类型(移动网络.Wifi). 二.如何实现 Reachabili ...

  9. Android中判断网络连接是否可用及监控网络状态

    Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android ...

  10. netstat - 显示网络连接,路由表,接口状态,伪装连接,网络链路信息和组播成员组。

    总览 SYNOPSIS netstat [address_family_options] [--tcp|-t] [--udp|-u] [--raw|-w] [--listening|-l] [--al ...

随机推荐

  1. 分布式共识算法随笔 —— 从 Quorum 到 Paxos

    分布式共识算法随笔 -- 从 Quorum 到 Paxos 本文主要参考各类英文文献,部分专业术语翻译较为生硬,望谅解. 概览: 为什么需要共识算法? 昨夜西风凋碧树,独上高楼,望尽天涯路 复制(Re ...

  2. TCP/IP协议(6): DHCP(Dynamic Host Configuration Protocol) 协议 —— 网络地址的分配方式

    TCP/IP协议(6): DHCP(Dynamic Host Configuration Protocol) 协议 -- 网络地址的分配方式 关于 DHCP(DHCP, Dynamic Host Co ...

  3. Java开发环境配置(win7-64bit)

    Java开发环境配置(win7-64bit) java Java开发环境配置(win7-64bit) Java开发环境配置(win7-64bit) 1.概述 2.文本用到的工具 3.环境变量配置 4. ...

  4. ElasticSearch7.6入门

    笔记记录 B站狂神说Java的ElasticSearch课程:https://www.bilibili.com/video/BV17a4y1x7zq 一.ElasticSearch概述 官网:http ...

  5. 基于IGServer的Web地图要素增删改查

    1. 引言 MapGIS IGServer 是中地数码的一款跨平台GIS 服务器产品,提供了空间数据管理.分析.可视化及共享服务 MapGIS IGServer的下载(试用)地址:MapGIS IGS ...

  6. 如何创建一个浏览器版的`Window11`

    如何创建一个浏览器版的Window11 我们接下来将创建一个在浏览器运行的Window11,可以先看看效果图 这是基于Windows 11 in React修改的功能,我们接下来就将使用Windows ...

  7. [引擎开发] 深入GPU和渲染优化(基础篇)

    https://blog.csdn.net/ZJU_fish1996/article/details/109269448

  8. pdf.js 跨域完美解决!

    在网上查看很多方法去解决此类跨域问题,及如何动态加载pdf文件.看来看去 请求的由后台处理加header头的  pdf.js 自带的 获取地址栏param参数值的 都是很麻烦的步骤并且有时不能有效解决 ...

  9. JS输出formData的全部值

    //第一种 for (var value of formData.values()) { console.log(value); } //第二种 for (var [a, b] of formData ...

  10. FPGA MIG调试bug(一)

    目标器件:复旦微FPGA:JFM7K325T8FCBGA676(对标Xilinx Kintex-7系的XC7K325T) 工程背景:板载4片DDR(AllianceMemory_DDR3L_8G_AS ...