首页 > 其他分享 >Qt使用Http协议进行通信

Qt使用Http协议进行通信

时间:2023-04-21 17:23:16浏览次数:47  
标签:Http Qt request 通信 return QString error reply 请求

原文地址 blog.csdn.net

原文链接

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

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

QT += network

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

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

1.多个独立参数GET请求

2.参数数组GET请求

3.上传参数数据POST请求

4.上传参数和文件POST请求

5.下载文件GET请求

下面通过简单的Demo描述五种请求的调用方式。

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));

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);

19.      //对请求的返回异常进行处理
20.      if(reply->error() != QNetworkReply::NoError)
21.      {
22.          return reply->error();
23.      }

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.          {

41.          }
42.          return 0;
43.      }
44.      else
45.      {
46.          //请求失败对对应的处理
47.          return codeStr.toInt();
48.      }
49.  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

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.      }

12.      QJsonDocument document;
13.      document.setArray(array);
14.      QString arrayString = document.toJson(QJsonDocument::Compact);

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));

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.      }

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.          {

52.          }
53.          return 0;
54.      }
55.      else
56.      {
57.          //请求失败对对应的处理
58.          return codeStr.toInt();
59.      }
60.  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

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");

13.      //获取对应的参数数据
14.      QByteArray data;
15.      data.append("paramer1=");
16.      data.append(paramer1.toUtf8());
17.      data.append("&paramer2=");
18.      data.append(paramer2.toUtf8());

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.      }

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.          {

48.          }
49.          return 0;
50.      }
51.      else
52.      {
53.          //请求失败对对应的处理
54.          return codeStr.toInt();
55.      }
56.  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

4.上传参数和文件POST请求

`

1.  int PostRequestWithFile(QString paramer1, QString paramer2,QString filePath)
2.  {

4.      //生成对应的网址请求
5.      QFileInfo fileInfo(filePath);
6.      QString fileName =fileInfo.fileName();

8.      QFile* inputFile = new QFile(filePath);
9.      inputFile->open(QIODevice::ReadOnly);

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);

21.      QHttpPart paramer1Part;
22.      paramer1Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"paramer1\""));
23.      paramer1Part.setBody(paramer1.toUtf8());
24.      multiPart->append(paramer1Part);

26.      QHttpPart paramer2Part;
27.      paramer2Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"paramer2\""));
28.      paramer2Part.setBody(paramer2.toUtf8());
29.      multiPart->append(paramer2Part);

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));

41.      //发送请求
42.      QNetworkAccessManager manager;
43.      QNetworkReply *reply = manager.post(request,multiPart);
44.      multiPart->setParent(reply);

46.      QEventLoop eventLoop;
47.      QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)),&eventLoop, SLOT(quit()));
48.      eventLoop.exec(QEventLoop::ExcludeUserInputEvents);

50.      if(reply->error() != QNetworkReply::NoError)
51.      {
52.          return reply->error();
53.      }

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.          {

71.          }
72.          return 0;
73.      }
74.      else
75.      {
76.          //请求失败对对应的处理
77.          return codeStr.toInt();
78.      }
79.  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
  1. 下载文件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);

16.      //获取下载返回值
17.      QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
18.      if (statusCode.toInt() != 200)
19.      {
20.          return -1;
21.      }

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.  }


标签:Http,Qt,request,通信,return,QString,error,reply,请求
From: https://www.cnblogs.com/cps666/p/17341130.html

相关文章

  • MQTT基础介绍
    MQTT与HTTP的区别HTTP协议是客户端与服务端直连请求与响应MQTT是基于发布订阅模型的轻量级的消息传输协议MQTT能力发布:Publish订阅:Subscribe代理:Broker,管理通信执行模式:客户端发送消息到broker,broker将消息发送给订阅过的客户端MQTT通信模式一对一:点对点通信......
  • ImportError: DLL load failed while importing QtChart: 找不到指定的模块
    这个错误通常是由于您的Python环境缺少QtChart模块或QtChart模块依赖的库文件之一导致的。解决此问题的方法可能因操作系统和Python环境而异,但下面是一些常见的解决方法:检查是否已安装QtChart模块和其依赖项。您可以使用pip命令在终端中安装QtChart模块:Copycodepipinstal......
  • MQTT报文分析
    一、问题引入MQTT属于应用层协议,基于TCP/IP架构实现,那么它的报文是如何定义的呢?或许可以像分析http协议那样,利用抓包工具:wireshark分析报文。二、解决过程......
  • Ubuntu操作系统纯内网环境搭建ntp时钟同步服务器//京鸿通信/www.kyohoon.com/15507589
    一、环境准备   服务器:192.168.10.181(Ubuntu操作系统)   客户端:192.168.10.82 (Ubuntu操作系统)  所有服务器均不能访问互联网二、ntp服务器端操作:   (1).现在服务器端安装ntp服务器安装包,首先需要在172.16.20.129服务器上准备好ntp安装包。并进行安装ntp......
  • 网络编程-UDP通信程序
    网络编程-UDP通信程序InetAddressaddress=InetAddress.getByName("Dinesaw");System.out.println("主机名:"+address.getHostName());System.out.println("IP地址:"+address.getHostAddress());UDP发送数据Java中的UDP通信UDP协议是一种不可靠的网络协议,它在通信的......
  • java 实现简单的http服务器
    1、废话不多说,代码如下packagecom.linhuaming.test;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.ServerSocket;importjava.net.Socket;/***http服务器测试*/publicclassHttpServerTest{publi......
  • android系统adb对时//京鸿通信/www.kyohoon.com/15507589165
    目录1、远程连接设备2、设置地区3、设置对时服务器4、重启设备5、查看对时服务器是否设置成功1、远程连接设备adbconnectxxx.xxx.xxx.xxx2、设置地区adbshellsetproppersist.sys.timezoneAsia/Shanghai3、设置对时服务器adbshellsettingsputglobalntp_server172.16.......
  • Socks5代理与HTTP代理:基本概念、工作原理和在网络应用中的应用
      在互联网上,代理服务器是一种非常重要的技术手段,可以实现许多网络应用的高效和安全运行。Socks5代理和HTTP代理是两种常见的代理服务器类型,它们在网络应用中都有着重要的作用。本文将介绍Socks5代理和HTTP代理的基本概念、工作原理以及在网络应用中的应用。第一部分:Socks5代理......
  • Android进程间的通信方式
    原文地址juejin.cn前言在日常的开发中,我们可能会接触到多进程,比如向外界提供服务,或者因为某些原因把某个操作分离到独立的进程执行等等。那么进程与进程之间没办法直接进行数据的传输,也就是我们常说的进程间通信,因此需要借助特定的方案,下面我们一起了解一下几种进程间通信的......
  • 深入理解Android进程间通信机制
    原文地址juejin.cnAndroid系统中有大量IPC(进程间通信)的场景,比如我们想要创建一个新的进程,需要通过Socket这种IPC方式去让ZygoteFork新进程;如果我们要杀掉一个进程,需要通过信号这种IPC方式去将SIGNAL_KILL信号传递到系统内核;如果我们想要唤醒主线程处于休眠中的Looper,需要管道......