使用Qt进行HTTP通信的方法
文章目录
- 1 HTTP协议简介
- 1.1 HTTP协议的历史和发展
- 1.2 HTTP协议的特点
- 1.3 HTTP的工作过程
- 1.4 请求报文
- 1.5 响应报文
- 2 使用Qt进行HTTP通信
- 2.1 Qt的HTTP通信类
- 2.2 HTTP通信过程
- 3 JSON
- 3.1 cJSON库简介
- 3.2 cJSON库的设计思想和数据结构
- 3.3 cJSON库的使用方法
1 HTTP协议简介
1.1 HTTP协议的历史和发展
HTTP诞生于1991年,最初的版本号是0.9。1996年,HTTP/1.0诞生,增加了HEAD、POST等方法,增加了响应状态码并引入了HTTP Header(HTTP头部)。1999年推出的HTTP/1.1引入了长连接、并发连接、管道机制等。2015年,发布了HTTP/2,默认不再使用ASCII编码传输数据,而是改为传输二进制数据。HTTP/2在发送请求时会将每个请求的内容封装成带有编号的帧,然后同时发送。这种利用一个连接来发送多个请求的方式称为“多路复用”。2018年发布了HTTP/3。HTTP/3将底层依赖的TCP协议改成了UDP协议。
1.2 HTTP协议的特点
HTTP协议是基于请求与响应模式的、无状态的协议。请求由客户端发起,服务端响应请求。无状态指在客户端和服务端交互完成后,两者之间不会保留任何状态信息。HTTP协议的通信方式简单、灵活,具有很好的可扩展性。
1.3 HTTP的工作过程
(1)建立TCP连接。
解析服务器的域名,得到服务器IP地址。然后和服务器建立TCP连接。
(2)浏览器向服务器发送HTTP请求。包括客户端需要的文档信息和Accept、User-Agent等附加信息。
(3)服务器应答。应答内容包括HTTP协议的版本号、应答状态码、被请求的文档内容等。
(4)服务器关闭HTTP连接。
(5)重复2~4步,浏览器请求并接收服务器应答的HTML、CSS、JS、图片等文档、进行页面渲染,或者将接收到应答文件进行保存。
(6)服务器关闭TCP连接。当服务器决定不再与浏览器通信时,就会关闭TCP连接。
1.4 请求报文
HTTP/1.1的请求报文由四部分构成。请求行包括请求方法、URL和协议版本。头部位于请求行之后,每一行都包含一个头部字段名和对应的值。实体是请求报文的数据,在POST方法中使用。如果请求方法为GET,那么请求数据为空。实体与头部之间用一个空行分隔。报文中的空格、回车符和换行符均不可省略。
请求方法是客户端通过请求方法向服务器说明自己的意图的方式,常用的有GET、POST、PUT、DELETE等方法。
头部由一系列的“字段:值”构成,起到了传递额外信息的作用。
1.5 响应报文
服务器收到请求报文后,就会做出响应并发送响应报文。响应报文在结构上与请求报文几乎完全一致,只是个别字段的作用不同。
响应报文由三部分构成。状态行包括协议版本、状态码和状态短语。头部与请求报文中的头部类似,由一系列的“字段:值”构成,起到了传递额外信息的作用。实体是响应报文的数据,在GET方法中使用。实体与头部之间用一个空行分隔。报文中的空格、回车符和换行符均不可省略。
2 使用Qt进行HTTP通信
2.1 Qt的HTTP通信类
Qt的网络模块提供了HTTP通信类QNetworkRequest
、QnetworkAccessManager
和QNetworkReply
。要使用这些类,需要在项目的pro文件中引用network模块:
QT += network
并在源文件中引用头文件:
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QNetworkReply>
2.2 HTTP通信过程
使用这几个类进行HTTP通信的过程可以分为三步:
(1) 使用QNetworkRequest
类对象创建网络请求。
(2) 使用QNetworkAccessManager
类对象执行网络通信。QNetworkAccessManager
类对象用于管理程序的HTTP通信,提供了get()、post()、put()
等多个函数,分别对应于HTTP协议的GET、POST、PUT
等方法。调用这些函数会返回一个QNetworkReply
对象,里面保存着服务器的响应数据。一个程序只要有一个QnetworkAccessManager
类对象即可。QNetworkAccessManager
类还提供了一些信号,如收到服务器响应的finished()
信号,网络状态发生改变的networkAccessibleChanged()
信号等。
(3) 通过QNetworkReply接收服务器响应。
QNetworkAccessManager
类对象会将服务器的响应报文保存在一个QNetworkReply
类对象中,并通过信号finished(QNetworkReply*)
将这个QNetworkReply
类对象的指针发射出去。QNetworkReply
类也是QIODevice
的子类,可以像操作串口一样调用read()函数读取服务器返回的信息。QNetworkReply
类还提供了finished()、readyRead()等信号,可以根据信号执行相应的操作。
3 JSON
JSON是一种轻量级的数据交换格式,它采用完全独立于编程语言的文本格式来存储和表示数据,可以高效地传递大量数据。
JSON的数据类型
(1)数值:即十进制数,如12、3.14、5.2e4等。在JSON中,数值可以为负数,可以有小数部分,还可以用e或者E表示指数部分,但是不能有前导0。JSON不区分整数与浮点数。
(2)字符串:即以英文双引号包围起来的零个或多个Unicode字符,如"Hello"或""。
(3)布尔值:即true或者false。JSON的布尔值必须是小写字母。
(4)数组:即有序的零个或者多个值,每个值可以为任意类型。数组使用英文方括号包围起来,元素之间用英文逗号分隔,如:[“aa”, “bb”, “cc”]、[[3, 1], [4, 1], [5, 9]]等。
(5)对象:对象以英文花括号包围起来,内部包含若干无序的键-值对。不同键值对之间使用逗号分隔。键只能是字符串,值可以是上述各种类型的数据,也可以是另一个对象(即对象的嵌套)。
3.1 cJSON库简介
cJSON是一个使用C语言编写的JSON操作库,具有轻便、可移植、单文件的特点,可以方便地生成、解析JSON数据。cJSON库的源码文件只有两个,即cJSON.h和cJSON.c。使用时只需将这两个文件添加到工程即可。
3.2 cJSON库的设计思想和数据结构
cJSON在生成和解析JSON数据时,不是将一整段JSON数据作为整体进行处理,而是将整个JSON数据拆分成了一个一个的键值对。每个键值对都保存在一个cJSON结构体中。按照JSON数据的层次关系,处于同一级的cJSON结构体组成双向链表,不同级的链表之间通过指针连接。
3.3 cJSON库的使用方法
cJSON库提供了一系列API来生成和解析JSON数据。其中,生成JSON数据的API包括cJSON_CreateObject()
、cJSON_CreateArray()
、cJSON_CreateString()
、cJSON_CreateNumber()
等;解析JSON
数据的API包括cJSON_Parse()
、cJSON_GetObjectItem()
、cJSON_GetArraySize()
等。使用cJSON库,可以方便地在C语言中处理JSON数据。
相关文章:
使用Qt进行HTTP通信的方法
文章目录 1 HTTP协议简介1.1 HTTP协议的历史和发展1.2 HTTP协议的特点1.3 HTTP的工作过程1.4 请求报文1.5 响应报文 2 使用Qt进行HTTP通信2.1 Qt的HTTP通信类2.2 HTTP通信过程 3 JSON3.1 cJSON库简介3.2 cJSON库的设计思想和数据结构3.3 cJSON库的使用方法 1 HTTP协议简介 1.1…...
第45节——页面中修改redux里的数据
一、什么是action 在 Redux 中,Action 是一个简单的 JavaScript 对象,用于描述对应应用中的某个事件(例如用户操作)所发生的变化。它包含了一个 type 属性,用于表示事件的类型,以及其他一些可选的数据。 …...
软考 系统架构设计师系列知识点之软件架构风格(2)
接前一篇文章:软考 系统架构设计师系列知识点之软件架构风格(1) 这个十一注定是一个不能放松、保持“紧”的十一。由于报名了全国计算机技术与软件专业技术资格(水平)考试,11月4号就要考试,因此…...
【C++11】Lambda 表达式:基本使用 和 底层原理
文章目录 Lambda 表达式1. 不考虑捕捉列表1.1 简单使用介绍1.2 简单使用举例 2. 捕捉列表 [ ] 和 mutable 关键字2.1 使用方法传值捕捉传引用捕捉 2.2 捕捉方法一览2.3 使用举例 3. lambda 的底层分析 Lambda 表达式 书写格式: [capture_list](parameters) mutabl…...

【网络安全---ICMP报文分析】Wireshark教程----Wireshark 分析ICMP报文数据试验
一,试验环境搭建 1-1 试验环境示例图 1-2 环境准备 两台kali主机(虚拟机) kali2022 192.168.220.129/24 kali2022 192.168.220.3/27 1-2-1 网关配置: 编辑-------- 虚拟网路编辑器 更改设置进来以后 ,先选择N…...

【Docker】Docker的应用包含Sandbox、PaaS、Open Solution以及IT运维概念的详细讲解
前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 📕作者简介:热…...
Java Applet基础
Java Applet基础 目录 Java Applet基础 Applet的生命周期 "Hello, World" Applet: Applet 类 Applet的调用 获得applet参数 指定applet参数 应用程序转换成Applet 事件处理 显示图片 播放音频 applet是一种Java程序。它一般运行在支持Java的Web浏览器内。因…...

【记录】IDA|IDA怎么查看当前二进制文件自动分析出来的内存分布情况(内存范围和读写性)
IDA版本:7.6 背景:我之前一直是直接看Text View里面的地址的首尾地址来判断内存分布情况的,似乎是有点不准确,然后才想到IDA肯定自带查看内存分布情况的功能,而且很简单。 可以通过View-Toolbars-Segments,…...

LIMS实验室信息管理系统源码 基于计算机的数据处理技术、数据存储技术、网络传输技术、自动化仪器分析技术于一体
LIMS 是一个集现代化管理思想与基于计算机的数据处理技术、数据存储技术、网络传输技术、自动化仪器分析技术于一体,以实验室业务和管理工作为核心,遵循实验室管理国际规范,实现对实验室全方位管理的信息管理系统。 LIMS将样品管理、数据管理…...
有效括号相关
相关题目 20. 有效的括号 921. 使括号有效的最少添加 1541. 平衡括号字符串的最少插入次数 32. 最长有效括号 # 20. 有效的括号 class Solution:def isValid(self, s: str) -> bool:stack []for pare in s:if pare in ([{:stack.append(pare)if not stack or (pare ) and…...
浅谈泛型擦除
文章目录 泛型擦除(1)转换泛型表达式(2)转换泛型方法泛型擦除带来的问题 泛型擦除 在编码阶段使用泛型时加上的类型参数,会被编译器在编译阶段去掉,这个过程叫做泛型擦除。 泛型主要用于编译阶段。在编译后生成的Java字节码文件中不包含泛型中的类型信息…...

nodejs+vue校园跑腿系统elementui
购物车品结算,管理个人中心,订单管理,接单处理,商品维护,用户管理,系统管理等功育食5)要求系统运行可靠、性能稳定、界面友好、使用方便。 第三章 系统分析 10 3.1需求分析 10 3.2可行性分析 10 3.2.1技术…...
Redis Cluster Cron调度
返回目录 说明 clusterCron 每秒执行10次clusterCron 内置了一个iteration计数器。每一次运行clusterCron,iteration都加1。当 iteration % 10 0的时候,就会随机选取一个节点,给它发送PING。而由于clusterCron每秒执行10次,所以…...
Redis Cluster Gossip Protocol: Message
返回目录 消息结构 消息头部消息数据(可选)extension(可选) 消息头部 字段定义 Signature: “RCmb” 这4个字符(Redis Cluster message bus 的简称)totalLen: 消息的总字节数version:当前为…...

【JVM】第四篇 垃圾收集器ParNewCMS底层三色标记算法详解
导航 一. 垃圾收集算法详解1. 分代收集算法2. 标记-复制算法3. 标记-清除算法4. 标记-整理算法二. 垃圾收集器详解1. Serial收集器2. Parallel Scavenge收集器3. ParNew收集器4. CMS收集器三. 垃圾收集底层三色标记算法实现原理1. 垃圾收集底层使用三色标记算法的原因?2. 垃圾…...

STM32复习笔记(四):独立看门狗IWDG
目录 (一)简介 (二)CUBEMX工程配置 (三)相关函数 总结: (一)简介 独立看门狗本质是一种定时器,其作用是监视系统的运行,当系统发生错误&…...
SpringBoot中常用注解的含义
一、方法参数注解 1. PathVariable 通过RequestMapping注解中的 { } 占位符来标识URL中的变量部分 在控制器中的处理方法的形参中使用PathVariable注解去获取RequestMapping中 { } 中传进来的值,并绑定到处理方法定一的形参上。 //请求路径:http://3333…...

学位论文的写作方法,较好的参考文章
摘要 结合2个文章: [1]程鑫. 网联环境下交通状态预测与诱导技术研究[D]. 长安大学, 2017. [2]吴昊. 关中平原水资源变化特征与干旱脆弱性研究[D]. 长安大学, 2018. 主要研究内容及技术路线 各章小结和引言的写作 [1]程鑫. 网联环境下交通状态预测与诱导技术…...

基于SpringBoot的科研工作量获奖项目管理平台设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

嵌入式Linux应用开发-驱动大全-第一章同步与互斥④
嵌入式Linux应用开发-驱动大全-第一章同步与互斥④ 第一章 同步与互斥④1.5 自旋锁spinlock的实现1.5.1 自旋锁的内核结构体1.5.2 spinlock在UP系统中的实现1.5.3 spinlock在SMP系统中的实现 1.6 信号量semaphore的实现1.6.1 semaphore的内核结构体1.6.2 down函数的实现1.6.3 u…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...