当前位置: 首页 > news >正文

QT中网络编程之发送Http协议的Get和Post请求

文章目录

  • HTTP协议
  • GET请求
  • POST请求
  • QT中对HTTP协议的处理
    • 1.QNetworkAccessManager
    • 2.QNetworkRequest
    • 3.QNetworkReply
  • QT实现GET请求和POST请求
    • Get请求步骤
    • Post请求步骤
  • 测试结果

使用QT的开发产品最终作为一个客户端来使用,很大的一个功能就是要和后端服务器进行交互。
当前使用的QT版本如下:
在这里插入图片描述

HTTP协议

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而 消息内容则具有一个类似MIME的格式。
在这里插入图片描述

GET请求

GET 从指定的资源请求数据。必要时,可以将查询字符串参数追加到URL的末尾,以便将信息发送给服务器。GET因为参数会放在url中,所以隐私性,安全性较差,请求的数据长度是有限制的,不同的浏览器和服务器不同,一般限制在 2~8K 之间,更加常见的是 1k 以内。

POST请求

POST向指定的资源提交要被处理的数据。POST请求应该把数据作为请求的主体提交,请求主体(body)可以包括非常多的数据,且数据格式不限。POST请求是没有的长度限制,请求数据是放在body中。

QT中对HTTP协议的处理

Qt中提供了QNetworkAccessManager、QNetworkRequest和QNetworkReply,用于应用程序对网络访问的处理。

1.QNetworkAccessManager

QNetworkAccessManager 提供了应用程序通过网络发送请求的能力。

2.QNetworkRequest

QNetworkRequest 保存通过网络发送请求所需的信息。 它包含一个 URL 和一些可用于修改请求的辅助信息。

3.QNetworkReply

QNetworkReply 类封装了使用 QNetworkAccessManager 发布的请求相关的回复信息。QNetworkReply 是 QIODevice的子类,这意味着一旦从对象中读取数据,它就不再由设备保留。因此,如果需要,应用程序有责任保留这些数据。

QT实现GET请求和POST请求

项目结构预览:
在这里插入图片描述
在这里插入图片描述
头文件httpoperate.h内容

#ifndef HTTPOPERATE_H
#define HTTPOPERATE_H#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>class HttpOperate:public QObject
{Q_OBJECT
public:HttpOperate();void SendPostRequst();//用于发送Post请求的成员函数void SendGetRequst();//用于发生Get请求的成员函数private:QNetworkAccessManager* mNetworkManager;QNetworkReply* mReply;public slots: //类中做槽函数的成员函数一般写在public slots下,Qt5以及以上版本可以不写public slotsvoid ReplyFinshed();
};#endif // HTTPOPERATE_H

源文件httpoperate.cpp中的内容

#include "httpoperate.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QStringDecoder>
#include <QObject>
HttpOperate::HttpOperate() {}void HttpOperate::SendGetRequst()
{mNetworkManager = new QNetworkAccessManager(this);QNetworkRequest _quest;QString url = "http://127.0.0.1:8083/v3/api/client/v1/captchaImage";url.append("?key1=小强&key2=xiao qing");_quest.setUrl((QUrl(url)));_quest.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");mReply = mNetworkManager->get(_quest);QByteArray _data = mReply->readAll();//读出数据//QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8().constData();qInfo()<<"1_data ==> "<<_data;//connect(mReply,&QNetworkReply::finished,this,&HttpOperate::ReplyFinshed);//方式一// auto lambdaFun = [=]{ReplyFinshed();};//lambda函数// connect(mReply,&QNetworkReply::finished,this,lambdaFun);connect(mReply,&QNetworkReply::finished,this,[=]{ReplyFinshed();});qInfo()<<"2_data ==> " << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8().constData();
}void HttpOperate::SendPostRequst()
{mNetworkManager = new QNetworkAccessManager(this);QNetworkRequest _quest;_quest.setUrl((QUrl("http://127.0.0.1:8083/v3/api/client/v1/createSignature")));// _quest.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");_quest.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");QJsonDocument document;QJsonObject obj;obj.insert("key1", "小明");obj.insert("key2", "xiao hong");document.setObject(obj);QByteArray _postData = document.toJson(QJsonDocument::Compact);//以Json字符串的方式传参mReply = mNetworkManager->post(_quest,_postData);QByteArray _data = mReply->readAll();//读出数据qDebug()<<"1_data ==> "<<_data;//此s时数据为空//connect(mReply,&QNetworkReply::finished,this,&HttpOperate::ReplyFinshed);//方式一// auto lambdaFun = [=]{ReplyFinshed();};//lambda函数// connect(mReply,&QNetworkReply::finished,this,lambdaFun);//方式二connect(mReply,&QNetworkReply::finished,this,[=]{ReplyFinshed();});//方式三qDebug()<<"2_data ==> ";
}void HttpOperate::ReplyFinshed()
{if (mReply->error() == QNetworkReply::NoError){// 处理返回的数据QByteArray _data = mReply->readAll();//读出数据auto toUtf16 = QStringDecoder(QStringDecoder::Utf8);QString str = toUtf16(_data);qInfo()<<"_data ==> "<<str;} else {// 处理错误qDebug()<<"error ==> "<<mReply->error();}mReply->deleteLater();
}

main.cpp中的代码:

#include <QCoreApplication>
#include "httpoperate.h"
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);HttpOperate hoper;hoper.SendPostRequst();//发起Post请求测试HttpOperate hoper1;hoper1.SendGetRequst();//发起Get请求测试return a.exec();//主程序会在这里阻塞
}

Get请求步骤

步骤:
1. 初始化QNetworkAccessManager对象。
2. 设置请求URL。
3. 连接消息返回。
4. 发送GET请求。
上面的关键代码就是:

/*内部发起http连接,连接成功后发起get请求.此接口是异步接口。请求发起后,会立即返回一个QNetworkReply类型对象的地址,此时打印它如上的1_data ==>结果为空字符串。当get请求响应返回后,会自动触发mReply所指对象的finished信号,此时mReply指对象里就有数据了,类似于Ajax的请求方式。然后调用响应的槽函数ReplyFinshed()处理读取数据的操作。
*/
mReply = mNetworkManager->post(_quest,_postData);
connect(mReply,&QNetworkReply::finished,this,&HttpOperate::ReplyFinshed);//将信号和槽函数进行关联,类似于绑定或注册的作用

Post请求步骤

初始化QNetworkAccessManager对象。
设置请求URL。
设置请求头Header
设置请求主体
连接消息返回。
发送POST请求。

/*内部发起http连接,连接成功后发起post请求.此接口是异步接口。请求发起后,会立即返回一个QNetworkReply类型对象的地址,此时打印它如上的1_data ==>结果为空字符串。当get请求响应返回后,会自动触发mReply所指对象的finished信号,此时mReply指对象里就有数据了,类似于Ajax的请求方式。然后调用响应的槽函数ReplyFinshed()处理读取数据的操作。
*/
mReply = mNetworkManager->get(_quest);
connect(mReply,&QNetworkReply::finished,this,&HttpOperate::ReplyFinshed);//将信号和槽函数进行关联,类似于绑定或注册的作用

测试结果

get请求测试后端服务使用的是springboot服务
后端接口为:
在这里插入图片描述
后端打印内容:
在这里插入图片描述
QT控制台输出内容:
在这里插入图片描述
post请求测试后端服务使用的也是springboot服务
后端接口为:
在这里插入图片描述
后端打印内容:
在这里插入图片描述
QT控制台输出内容:
在这里插入图片描述

相关文章:

QT中网络编程之发送Http协议的Get和Post请求

文章目录 HTTP协议GET请求POST请求QT中对HTTP协议的处理1.QNetworkAccessManager2.QNetworkRequest3.QNetworkReply QT实现GET请求和POST请求Get请求步骤Post请求步骤 测试结果 使用QT的开发产品最终作为一个客户端来使用&#xff0c;很大的一个功能就是要和后端服务器进行交互…...

Java 并发编程 —— Fork/Join 框架的原理详解

目录 一. 前言 二. 并发和并行 2.1. 并发 2.2. 并行 2.3. 分治法 三. ForkJoin 并行处理框架的理论 3.1. ForkJoin 框架概述 3.2. ForkJoin 框架原理 3.3. 工作窃取算法 四. ForkJoin 并行处理框架的实现 4.1. ForkJoinPool 类 4.2. ForkJoinWorkerThread 类 4.3.…...

3-10岁孩子语文能力培养里程碑

文章目录 基础能力3岁4岁5岁6-7岁&#xff08;1-2年级&#xff09;8-9岁&#xff08;3-4年级&#xff09;10岁&#xff08;5年级&#xff09; 阅读推荐&父母执行3岁4-5岁6-7岁&#xff08;1-2年级&#xff09;8-9岁&#xff08;3-4年级&#xff09;10岁&#xff08;5年级&a…...

Vue+ElementUi 基于Tree实现动态节点添加,节点自定义为输入框列

VueElementUi 基于Tree实现动态节点手动添加&#xff0c;节点自定义为输入框列 代码 <el-steps :active"active" finish-status"success" align-center><el-step title"test1"/><el-step title"test2"/><el-st…...

Web前端-JavaScript(js数组和函数)

文章目录 1.数组1.1 数组的概念1.2 创建数组1.3 获取数组中的元素1.4 数组中新增元素1.5 遍历数组 2.函数2.1 函数的概念2.2 函数的使用函数声明调用函数函数的封装 2.3 函数的参数函数参数语法函数形参和实参数量不匹配时 2.4 函数的返回值2.4.1 案例练习 2.5 arguments的使用…...

判断数据是否为整数--函数设计与实现

#定义函数&#xff1a;is_num(s),判断输入的数据是否整数。 #(1)判断是否是数字 def is_num(s):if s.isdigit(): #isdigit()是一个字符串方法&#xff0c;用于检查字符串是否只包含数字字符。如果字符串只包含数字字符&#xff0c;则返回True&#xff1b;否则返回Falsereturn T…...

netty源码:(29)ChannelInboundHandlerAdapter

它实现的方法都有一个ChannelHandlerContext参数&#xff0c;它的方法都是直接调用ChannelHandlerContext参数对应的方法&#xff0c;该方法会调用下一个handler对应的方法。 可以继承这个类&#xff0c;重写感兴趣的方法,比如channelRead. 这个类有个子类&#xff1a;SimpleC…...

Shell脚本应用(二)

一、条件测试操作 Shell环境根据命令执行后的返回状态值〈$?&#xff09;来判断是否执行成功&#xff0c;当返回值为О时表示成功.否则〈非О值)表示失败或异常。使用专门的测试工具---test命令&#xff0c;可以对特定条件进行测试&#xff0e;并根据返回值来判断条件是否成立…...

Kafka基本原理及使用

目录 基本概念 单机版 环境准备 基本命令使用 集群版 消息模型 成员组成 1. Topic&#xff08;主题&#xff09;&#xff1a; 2. Partition&#xff08;分区&#xff09;&#xff1a; 3. Producer&#xff08;生产者&#xff09;&#xff1a; 4. Consumer&#xff08;…...

使用Python爬取GooglePlay并从复杂的自定义数据结构中实现解析

文章目录 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》&#xff0c;对分布…...

前后端分离下的鸿鹄电子招投标系统:使用Spring Boot、Mybatis、Redis和Layui实现源码与立项流程

在数字化时代&#xff0c;采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…...

ChatGPT 有什么新奇的使用方式?

来看看 OpenAI 内部是如何使用 ChatGPT 的。 目前&#xff08;4月29日&#xff09;距离ChatGPT发布了已经半年&#xff0c;这期间大家基本上把能想到的ChatGPT的使用方法都研究遍了——从写作、写代码&#xff0c;到翻译、英语润色&#xff0c;再到角色扮演等等。 所以&#x…...

【计算机四级(网络工程师)笔记】操作系统概论

目录 一、OS的概念 1.1OS的定义 1.2OS的特征 1.2.1并发性 1.2.2共享性 1.2.3随机性 1.3研究OS的观点 1.3.1软件的观点 1.3.2资源管理器的观点 1.3.3进程的观点 1.3.4虚拟机的观点 1.3.5服务提供者的观点 二、OS的分类 2.1批处理操作系统 2.2分时操作系统 2.3实时操作系统 2.4嵌…...

LeetCode算法练习top100:(10)贪心算法

package top100.贪心算法;import java.util.ArrayList; import java.util.List;public class TOP {//121. 买卖股票的最佳时机public int maxProfit(int[] prices) {int res 0, min prices[0];for (int i 1; i < prices.length; i) {if (prices[i] < min) {min price…...

随记-探究 OpenApi 的加密方式

open api 主要参数如下 appKey 接口Key&#xff08;app id&#xff09;appSecret 接口密钥timeStamp 时间戳 毫秒nonceStr 随机字符串signature 加密字符串 客户端 使用 appSecret 按照一定规则将 appKey timeStamp nonceStr 进行加密&#xff0c;得到密文 signature将 appK…...

stm32学习总结:4、Proteus8+STM32CubeMX+MDK仿真串口收发

stm32学习总结&#xff1a;4、Proteus8STM32CubeMXMDK仿真串口收发 文章目录 stm32学习总结&#xff1a;4、Proteus8STM32CubeMXMDK仿真串口收发一、前言二、资料收集三、STM32CubeMX配置串口1、配置开启USART12、设置usart中断优先级3、配置外设独立生成.c和.h 四、MDK串口收发…...

配置paddleocr及paddlepaddle解决报错 GLIBCXX_3.4.30 FreeTypeFont

配置 https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/StyleText/README_ch.md#style-text 环境配置 https://www.paddlepaddle.org.cn/ 根据自己的cuda版本选择paddlepaddle-gpu # 新建conda环境 # python version conda create -n paddle python3.8 # 安装p…...

【实战】如何在Docker Image中轻松运行MySQL

定义 使用Docker运行MySQL有许多优势。它允许数据库程序和数据分离&#xff0c;增强了数据的安全性和可靠性。Docker Image的轻便性简化了MySQL的部署和迁移&#xff0c;而Docker的资源隔离功能确保了应用程序之间无冲突。结合中间件和容器化系统&#xff0c;Docker为MySQL提供…...

PLC物联网,实现工厂设备数据采集

随着工业4.0时代的到来&#xff0c;物联网技术在工厂设备管理领域的应用日益普及。作为物联网技术的重要一环&#xff0c;PLC物联网为工厂设备数据采集带来了前所未有的便捷和高效。本文将围绕“PLC物联网&#xff0c;实现工厂设备数据采集”这一主题&#xff0c;探讨PLC物联网…...

npm安装依赖报错ERESOLVE unable to resolve dependency tree(我是在taro项目中)(node、npm 版本问题)

换了电脑之后新电脑安装包出错 &#x1f447;&#x1f447;&#x1f447; npm install 安装包报错 ERESOLVE unable to resolve dependency tree 百度后尝试使用 npm install --force 还是报错 参考 有人说是 node 版本和 npm 版本的问题 参考 新电脑 node版本&#xff1a;16.1…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...