首页 > 其他分享 >QT使用Http协议通信的实现示例

QT使用Http协议通信的实现示例

时间:2024-05-03 13:33:42浏览次数:24  
标签:Http QT 示例 request return QString error reply 请求

转载自:https://www.jb51.net/program/3074287bh.htm   使用QT进行应用开发时,有时候需要进行客户端和服务端的网络通信,本文主要介绍了QT使用Http协议通信的实现示例,具有一定的参考价值,感兴趣的可以了解一下   −

目录

介绍

使用QT进行应用开发时,有时候需要进行客户端和服务端的网络通信,网络通信常用的一种协议就是http协议。QT对http协议进行了封装,下面将介绍两种http通信方式的使用。

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

1 QT += network

http主要两种通信方式为get和post两种

1.多个独立参数GET请求

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

2.参数数组GET请求

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

3.上传参数数据POST请求

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

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

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

5.下载文件GET请求

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

 到此这篇关于QT使用Http协议通信的实现示例的文章就介绍到这了,更多相关QT Http协议通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

 

 

扩展文章:

【Qt入门第32篇】 网络(二)HTTP:https://blog.csdn.net/hw5230/article/details/128254099

标签:Http,QT,示例,request,return,QString,error,reply,请求
From: https://www.cnblogs.com/FBsharl/p/18171146

相关文章

  • 如何通过`HTTP2`实现TCP的内网穿透?
    可能有人很疑惑应用层转发传输层?,为什么会有这样的需求啊???哈哈技术无所不用其极,由于一些场景下,对于一个服务器存在某一个内部网站中,但是对于这个服务器它没有访问外网的权限,虽然也可以申请端口访问外部指定的ip+端口,但是对于访问服务内部的TCP的时候我们就会发现忘记申请了!这个时......
  • 【Qt 专栏】信号与槽详解
    5个重要的结论:1.对于QT,GUI程序设计的逻辑需要4元素:信号、信号发射者、信号接受者、槽。例如,点击按键后,窗口关闭,这四者的关系如下所示: 2.信号函数返回类型为void,不需要实现。参数类型可以重载。调用时前面可以加emit(也可不加),表示信号释放。3.槽函数返回类型也为void,但一......
  • 【Qt 专栏】Qt Creator 的 git 配置 & 上传到gitee
    1.进入到Qt项目文件夹内,打开“GitBashHere”2.初始化,在“GitBashHere”中输入  gitinit3.加入所有文件,在“GitBashHere”中输入 gitadd. (需要注意,gitadd后面还有一个点)4.添加备注,gitcommit-m"备份"5.推送本地仓库到gitee(需要事先在gitee上创建好本......
  • 【Qt之JSON文件】QJsonDocument、QJsonObject、QJsonArray等类介绍及使用
    简述Qt5中包含了处理JSON的类,均以QJson开头(例如:QJsonDocument、QJsonArray、QJsonObject),在QtCore模块中,不需要额外引入其它模块。简述常用的JSON库JSON常用类简单的JSON对象简单的JSON数组复杂的JSON更多参考 常用的JSON库json.org 中介绍了......
  • Prometheus监控的4个黄金指标及示例
    Prometheus的黄金指标通常指的是在监控和度量系统性能时,关注的四个核心指标:延迟(Latency)、流量(Throughput)、错误(Errors)和饱和度(Saturation)。下面我将为你解释这些指标以及对应的PromQL(PrometheusQueryLanguage)写法。延迟(Latency)延迟是服务请求或操作所需的时间。例如,HTTP请求......
  • 供应链投毒预警:恶意Py包伪装HTTP组件开展CStealer窃密后门攻击
    概述近日(2024年4月25号),悬镜供应链安全情报中心在Pypi官方仓库(https://pypi.org/)中捕获1起CStealer窃密后门投毒事件,投毒者连续发布6个不同版本的恶意Py包multiplerequests,目标针对windows平台python开发者,该恶意包在安装时会远程加载CStealer后门到受害者系统上执行,该后门会窃取......
  • Qt - QListWidget+QListWidgetItem
    效果:文件结构:qcustomwidget.uiqcustomwidget.h(自定义条目类)#ifndefQCUSTOMWIDGET_H#defineQCUSTOMWIDGET_H#include<QWidget>namespaceUi{classQCustomWidget;}classQCustomWidget:publicQWidget//联系人类{Q_OBJECTpublic:QCustomWidget......
  • 【发现一个小问题】golang http client: 配置了Client 对象的 Timeout 就会导致 conte
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯我这样初始化了客户端:varclient=http.Client{Timeout:time.Duration(1000)*time.Millisecond,}然后在request创建过程中使用了context的timeout机制:tim......
  • 【moectf】web.http
    用wsrx打开靶机根据任务描述得到moectf{basic_http_knowledge_oen0w64iYZqSeT6BT8c9OgFTV-KNMT6g}......
  • 搭建https的es+kibana(7.9.1)
    背景:elasticsearch7需要开启https才可以创建报警,因此就需要搭建https的elasticsearch参考官方网站:https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-elasticsearch.html 第一步,创建crdkubectlcreate-fhttps://download.elastic.co/downloads/eck/2.12.1......