《十九》Qt Http协议及实战

前言

本篇文章来给大家讲解QT中的Http协议,Http协议主要用于网络中数据的请求和响应,那么这篇文章将给大家讲解一下这个协议。

一、HTTP概述

HTTP(超文本传输协议)是互联网上应用最为广泛的协议之一,它定义了客户端和服务器之间进行通信的规则。HTTP是一种无状态的协议,它通过请求-响应模型来实现客户端和服务器之间的数据传输。
以下是HTTP的一般工作流程:

1.客户端发送HTTP请求:客户端(通常是Web浏览器)向服务器发送HTTP请求。请求由以下部分组成:

  • 请求方法(GET、POST、PUT、DELETE等):指定服务器执行的操作类型。
  • 资源路径:指定要访问的服务器上的资源路径。
  • 请求头:包含有关请求的其他元数据,如请求的主机、内容类型等。
  • 请求正文(对于某些请求方法):包含请求所携带的数据。

2.服务器处理请求:服务器接收并解析HTTP请求,执行相应的操作:

  • 检查请求的合法性和安全性。
  • 处理请求中指定的资源或执行请求中指定的操作。
  • 构造HTTP响应。

3.服务器发送HTTP响应:服务器生成HTTP响应,响应由以下部分组成:

  • 状态码:指示请求是否成功或出现错误的数字代码。
  • 响应头:包含有关响应的元数据,如响应的内容类型、长度等。
  • 响应正文:包含服务器返回给客户端的实际数据。

4.客户端接收HTTP响应:客户端接收并解析HTTP响应:

  • 检查响应的状态码以确定请求的成功与否。
  • 解析响应头以获取响应的元数据。
  • 处理响应正文中的数据。

HTTP使用TCP协议作为传输协议,默认使用80端口进行通信。它是一种无连接协议,这意味着每个请求都是独立的,服务器不会保留先前请求的状态信息。为了在请求之间保持状态,可以使用Cookie或会话等机制。
此外,HTTP还支持各种请求方法,最常见的是GET和POST。GET方法用于从服务器获取资源,而POST方法用于向服务器提交数据。
总结起来,HTTP是一种用于在客户端和服务器之间传输数据的协议。它为Web应用程序提供了通信和数据交换的基础,是实现互联网应用的核心之一

二、HTTP的两种模型 

1.B/S模型 

B/S模型是一种基于浏览器和服务器的交互模型,通常用于Web应用程序。在这种模型中,客户端使用浏览器作为前端界面,通过HTTP协议与服务器进行通信。客户端(浏览器)负责显示用户界面,发送HTTP请求,并接收和渲染服务器返回的HTML、CSS和JavaScript等资源。服务器负责存储数据、处理业务逻辑和生成动态网页内容。B/S模型具有以下特点:

客户端只需安装浏览器,无需安装额外客户端软件。
应用程序部署在服务器上,用户通过浏览器访问。
跨平台性好,可以在不同操作系统和设备上使用。

2.C/S模型

C/S模型是一种基于客户端和服务器的交互模型,常用于传统的桌面应用程序。在这种模型中,客户端通过安装在本地计算机上的客户端软件与服务器进行通信。客户端负责处理用户界面和部分业务逻辑,发送请求到服务器并接收响应。服务器负责处理业务逻辑和存储数据。C/S模型具有以下特点:

  • 需要在客户端安装相应的客户端软件,适用于特定平台和操作系统。
  • 应用程序的逻辑部分可以在客户端执行,减轻服务器的负担。
  • 可以通过局域网或互联网与服务器进行通信。
  • 可以实现一些功能更复杂、操作更强大的应用程序。

三、QT中的HTTP类 

 在Qt中,用于进行HTTP通信的类是QNetworkAccessManager类和相关的类。QNetworkAccessManager提供了一个用于发送网络请求和接收网络响应的高层API,它基于Qt的网络模块实现。

以下是一些与HTTP通信相关的类和其主要功能:

QNetworkAccessManager类:
  •  该类用于发送HTTP请求和接收HTTP响应。
  • 可以发起GET、POST、PUT、DELETE等各种类型的请求。
  • 提供了信号和槽机制,允许处理请求的完成、错误和响应等事件。
  • 支持同步和异步方式发送请求。
QNetworkRequest类:
  •  表示一个HTTP请求。
  • 可以设置请求的URL、请求头、请求方法等属性。
  • 可以添加自定义的请求头字段。
QNetworkReply类:
  •  表示一个HTTP响应。
  • 提供了获取响应状态码、响应头、响应正文等信息的方法。
  • 可以通过该类获取服务器返回的数据。
QNetworkCookieJar类:
  •  用于管理和存储HTTP请求和响应中的Cookie。
  • 可以设置和获取Cookie,并将其与请求关联起来。
  • 这些类的组合使用可以实现在Qt应用程序中进行HTTP通信的功能。

 

四、使用HTTP类请求数据 

使用HTTP类请求数据步骤:

1.使用QNetworkAccessManager类创建网络访问管理器

2.使用QNetworkRequest创建请求对象

3.使用QNetworkReply发出GET请求(在请求完成后一定要记得使用deleteLater来清理释放资源)

4.连接信号与槽得到数据

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);mgr=new QNetworkAccessManager(this);connect(mgr,SIGNAL(finished(QNetworkReply*)),this,SLOT(replayFinishedFunc(QNetworkReply *)));}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::replayFinishedFunc(QNetworkReply *reply)
{QString strall=reply->readAll();//读取数据ui->textBrowser->setText(strall);//显示数据到文本reply->deleteLater();
}void MainWindow::on_pushButton_getdata_clicked()
{mgr->get(QNetworkRequest(QUrl("http://www.baidu.com")));
}

这是一个Qt框架下的MainWindow类的构造函数和析构函数以及其他成员函数的实现代码。这段代码主要完成以下几个功能:

  1. 构造函数中创建了一个QNetworkAccessManager对象mgr,用于发送网络请求。
  2. 连接QNetworkAccessManager对象mgr的finished()信号到槽replayFinishedFunc()上,当mgr完成网络请求时,会触发finished()信号,槽replayFinishedFunc()会被调用。
  3. replayFinishedFunc()函数是一个槽函数,用于处理QNetworkAccessManager对象mgr完成网络请求后返回的数据。它通过QNetworkReply对象的readAll()函数读取所有数据,并将其显示到文本控件ui->textBrowser中。
  4. on_pushButton_getdata_clicked()函数是一个槽函数,用于处理用户点击按钮pushButton_getdata事件。在该函数中,调用mgr->get()函数,发送一个GET请求到URL为"http://www.baidu.com"的网站上。

感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/674763.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

书生·浦语大模型实战营之 OpenCompass大模型评测

书生浦语大模型实战营之 OpenCompass :是骡子是马,拉出来溜溜 为什么要研究大模型的评测? 百家争鸣,百花齐放。 首先,研究评测对于我们全面了解大型语言模型的优势和限制至关重要。尽管许多研究表明大型语言模型在多…

庐山西海服务区:从高速服务区到旅游热点的华丽转身

五一假期期间,庐山西海服务区以其独特的魅力吸引了众多游客的目光。曾经只是一个供汽车加油和休息的普通服务区,如今却焕发出了绚丽的光彩,成为了周边地区备受瞩目的旅游热点。庐山西海服务区的转型,不仅为游客带来了丰富多样的娱…

20230507,LIST容器

学了又忘学了又忘,明知道会忘又不想复习又还得学 LIST容器 1.1 基本概念 链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的;链表由一系列结点组成 结点:一个是存储数据元素的数据域&a…

算法提高之树的最长路径

算法提高之树的最长路径 核心思想&#xff1a;树形dp 枚举路径的中间节点用f1[i] 表示i的子树到i的最长距离,f2[i]表示次长距离最终答案就是max(f1[i]f2[i]) #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N …

JavaScript异步编程——02-Ajax入门和发送http请求

同步和异步回顾 同步和异步的简单理解 同步&#xff1a;必须等待前面的任务完成&#xff0c;才能继续后面的任务。 异步&#xff1a;不受当前任务的影响。 拿排队举例&#xff1a; 同步&#xff1a;在银行排队时&#xff0c;只有等到你了&#xff0c;才能够去处理业务。 异…

NumPy及Matplotlib基本用法

NumPy及Matplotlib基本用法 导语NumPy导入与生成算术运算N维数组广播元素访问 Matplotlib简单图案绘制多函数绘制图像显示参考文献 导语 深度学习中经常需要对图像和矩阵进行操作&#xff0c;好在python提供了Numpy和Matplotlib库&#xff0c;前者类似一个已经定义的数组类&am…

基于FPGA的DDS波形发生器VHDL代码Quartus仿真

名称&#xff1a;基于FPGA的DDS波形发生器VHDL代码Quartus仿真&#xff08;文末获取&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; DDS波形发生器VHDL 1、可以输出正弦波、方波、三角波 2、可以控制输出波形的频率 DDS波形发生器原理…

Linux信号捕捉

要处理信号&#xff0c; 我们进程就得知道自己是否收到了信号&#xff0c; 收到了哪些信号&#xff0c; 所以进程需要再合适的时候去查一查自己的pending位图 block 位图 和 hander表&#xff0c; 什么时候进行检测呢&#xff1f; 当我们的进程从内核态返回到用户态的时候&…

基于Springboot的教学辅助系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的教学辅助系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

【Linux】Linux线程

一、Linux线程的概念 1.什么是线程 1.一个进程的一个执行线路叫做线程&#xff0c;线程的一个进程内部的控制序列。 2.一个进程至少有一个执行线程 3.线程在进程内部&#xff0c;本质是在进程地址空间内运行 4.操作系统将进程虚拟地址空间的资源分配给每个执行流&#xff0…

上位机图像处理和嵌入式模块部署(树莓派4b代码优化)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们把程序从pc端port到嵌入式开发板上面&#xff0c;好处是降低了部署成本&#xff0c;代价是牺牲了设备性能。所以等到程序真正在开发板子上面运…

YARN详解

YARN 简介 YARN 是Yet Another Resource Negotiator的缩写。 YARN是第二代MapReduce,即MRv2,是在第一代MapReduce基础上演变而来的,主要是为了解决原始Hadoop扩展性较差,不支持多计算框架而提出的;通俗讲就是资源管理器. YARN核心思想: 将 MR1 中资源管理和作业调度两个功能分…