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

Qt基础009(HTTP编程和QJSON)

文章目录

    • 软件开发网络架构
      • BS架构/CS架构
    • HTTP基本概念
    • QT的HTTP编程
    • JSON数据
      • 概述
      • QT生成JSON数据
      • QT解析JSON数据

软件开发网络架构

BS架构/CS架构

​ 在计算机网络和软件开发中,CS架构(Client-Server Architecture,客户端-服务器架构)和BS架构(Browser-Server Architecture,浏览器-服务器架构)是两种主要的应用程序架构。

​ CS架构是一种典型的两层结构,包括客户端和服务器两个部分。在这种架构中,客户端和服务器通过网络进行通信,每部分都有明确的职责。

  1. 客户端
  • 用户界面通常在客户端呈现。

  • 可以是桌面应用程序、移动应用或专用软件。

  • 负责向服务器发送请求,接收和处理服务器响应。

  1. 服务器
  • 管理数据和业务逻辑。

  • 处理来自客户端的请求,并发送回响应。

  • 通常承载在远程系统上,如数据库服务器、应用服务器等。

  1. 特点
  • 需要为每种操作系统或平台单独开发客户端。

  • 高效的数据处理和响应能力。

  • 在客户端设备上占用资源(如内存和处理能力)。

BS架构(浏览器-服务器架构)

BS架构是一种基于Web的层或多层架构,主要通过Web浏览器作为客户端访问服务器上的应用程序。

  1. 浏览器(客户端)
  • 使用标准Web浏览器(如Chrome、Firefox等)作为客户端。

  • 无需安装额外的软件,使用HTML、CSS和JavaScript显示内容。

  1. 服务器
  • 和CS架构中的服务器类似,处理业务逻辑和数据存储。

  • 通过Web服务(如HTTP服务器)提供页面和数据。

  1. 特点
  • 跨平台兼容性强,可以在任何支持Web浏览器的设备上运行。

  • 客户端无需安装专用软件,容易维护和更新。

  • 可能依赖网络性能,因为所有操作都在服务器上进行。

对比

  • 部署和维护:BS架构易于部署和维护,而CS架构通常需要在每个客户端单独安装和更新。

  • 性能:CS架构可以更有效地利用客户端的计算资源,适合高性能要求的应用。BS架构依赖于服务器的性能和网络延迟。

  • 安全性:CS架构中,数据经常在客户端和服务器之间传输,可能需要更复杂的安全措施。BS架构中,敏感数据主要存储在服务器端。

  • 用户体验:CS架构通常能提供更丰富的用户界面和交互功能。BS架构的用户体验受限于Web技术的能力。

在实际应用中,选择哪种架构取决于具体的业务需求、目标用户群、性能要求以及开发和维护的成本。

HTTP基本概念

HTTP(超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是万维网(WWW)的数据通信的基础。了解HTTP的基本概念对于理解现代网络通信至关重要。以下是HTTP的一些核心概念:

1. 请求和响应

HTTP是一个基于请求-响应模式的协议。客户端(通常是Web**浏览器)向服务器发送一个HTTP请求,然后服务器返回一个HTTP响应。**请求包含请求的资源(如网页),而响应包含请求的资源的内容。

  1. HTTP方法

HTTP定义了一系列的方法来表明对资源的不同操作,最常用的包括:

  • GET: 用于请求资源。

  • POST: 用于提交数据给服务器(例如,表单数据)。

  • PUT: 用于上传文件或内容。

  • DELETE: 用于请求删除资源。

  • HEAD: 用于获取资源的元信息,而不是资源本身。

3. 状态码

服务器对请求的响应中包含一个状态码,它表示请求的成功或失败,以及失败的原因。常见的状态码包括:

  • 200 OK: 请求成功。

  • 404 Not Found: 请求的资源未找到。

  • 500 Internal Server Error: 服务器内部错误。

  • 301 Moved Permanently: 请求的资源已永久移动到新位置。

4. URL**(统一资源定位符)**

URL是Web上资源的地址。它指定了资源的位置以及用于访问资源的协议(例如,http://)。

  1. HTTP头

HTTP请求和响应包含头部信息,这些信息包括元数据,如内容类型、内容长度、服务器信息、客户端信息等。例如, Content-Type 头部指示响应中的媒体类型(如text/html,application/json)。

6. 无状态协议

HTTP是一个无状态协议,这意味着服务器不会保留任何请求的数据(状态)。然而,通过使用如Cookies这样的机制,可以在多个请求之间维持状态。

7. **安全性(**HTTPS)

HTTPS是HTTP的安全版本,它在HTTP和TCP层之间增加了一个加密层(通常是SSL/TLS)。这提供了数据传输的加密和更好的安全性。

8. RESTful API

RESTful是一种使用HTTP协议的Web服务设计风格,它利用HTTP的方法来实现API的不同操作。在

RESTful架构中,每个URL代表一个资源,并使用HTTP的方法(如GET, POST)来处理这些资源。

9. Session和Cookies

由于HTTP本身是无状态的,Cookies和会话(Session)被用来在多个请求之间存储用户数据,从而为用户提供连贯的体验。

这些概念构成了HTTP的基础,是理解和使用HTTP协议的关键。每个概念都有它的具体细节和使用场景,了解这些有助于更好地在网络应用开发中应用HTTP。

QT的HTTP编程

Qt中的HTTP编程主要涉及使用Qt的网络模块来进行HTTP请求和处理HTTP响应。Qt提供了一系列类来处理网络通信,其中最常用的类是 QNetworkAccessManagerQNetworkRequestQNetworkReply 以及相关的支持类。

以下是一个基本的HTTP编程示例,展示了如何使用Qt发送一个简单的HTTP GET请求并处理响应:

步骤 1: 包含必要的头文件

#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QObject>
#include <QDebug>

步骤 2: 发送HTTP请求

创建一个 QNetworkAccessManager 对象,并使用它发送HTTP请求。 QNetworkAccessManager 对象会异步地处理请求,并返回一个 QNetworkReply 对象

int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QNetworkAccessManager manager;QNetworkRequest request(QUrl("http://example.com"));QNetworkReply *reply = manager.get(request);QObject::connect(reply, &QNetworkReply::finished, [&]() {if (reply->error()) {qDebug() << "Error:" << reply->errorString();return;}QString response = reply->readAll();qDebug() << "Response:" << response;});return a.exec();
}

​ 在这个例子中,我们使用 QNetworkAccessManager 的 get 方法发送了一个HTTP GET请求到"http://example.com"。然后,我们连接了 QNetworkReply 对象的 finished 信号到一个lambda函数,该函数在收到HTTP响应时被调用。

注意事项

  1. 异步处理: QNetworkAccessManager 的请求是异步的。这意味着 get 方法会立即返回,而HTTP响应将在稍后通过信号处理。

  2. 错误处理: 应该检查 QNetworkReply 对象是否有错误,并相应地处理。

  3. 内存管理: QNetworkReply 对象需要被正确地管理,以避免内存泄漏。通常情况下,使用QObject::deleteLater 来安排删除它是一个好方法。

JSON数据

概述

==JSON(JavaScript Object Notation)==是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成。JSON是基于JavaScript的一个子集,尽管它是独立于语言的,且有多种语言支持。JSON常用于网络应用程序中的数据传输,尤其是在Web应用程序中与后端服务器通信。

使用JSON的原因总结如下:

原因描述
易于阅读和编写JSON的结构简单、清晰,对人类来说易于阅读和编写。
轻量级数据格式相较于XML等标记语言,JSON更轻量,使用更少的符号,数据体积更小。
易于解析和生成大多数编程语言都提供了解析和生成JSON的内置支持或库。
跨语言支持JSON是独立于语言的,被广泛支持和使用在多种编程语言中。

BS/CS开发过程中,会使用不同的编程语言,JSON作为数据传输的标准化格式,方便程序员协议约定和数据处理,以下是不同编程语言处理JSON的方案

语言/平台JSON处理库/接口特点/描述
CJansson提供JSON的编码、解码和处理功能
C++nlohmann/json现代C++(从C++11开始)的JSON库,易于使用
JavaJackson强大的JSON处理库,支持JSON的序列化和反序列化
PythonjsonPython标准库中的JSON处理模块
QtQJsonDocumentQt框架中用于JSON处理的类
Androidorg.jsonAndroid SDK自带的JSON处理类,提供基础JSON操作功能

QT生成JSON数据

在Qt中生成JSON数据并将其保存到文件的一个基本示例涉及使用 QJsonDocumentQJsonObjectQJsonArray 类。以下是创建一个简单JSON对象并将其保存到文件的示例代码。

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QFile>
#include <QDebug>
void createJsonFile() {// 创建一个JSON对象 键值对QJsonObject jsonObj;jsonObj["name"] = "John Doe";jsonObj["age"] = 30;jsonObj["email"] = "john.doe@example.com";// 创建一个JSON数组QJsonArray jsonArr;jsonArr.append("C++");jsonArr.append("Python");jsonArr.append("JavaScript");jsonArr.append(123);// 将数组添加到JSON对象jsonObj["languages"] = jsonArr;// 将JSON对象转换为JSON文档QJsonDocument jsonDoc(jsonObj);// 将JSON文档转换为字符串(也可以是压缩格式)QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Indented);// 将JSON数据写入文件QFile file("output.json");if (!file.open(QIODevice::WriteOnly)) {qDebug() << "Failed to open file for writing";return;}file.write(jsonData);file.close();qDebug() << "JSON data saved to output.json";
}
int main() {createJsonFile();return 0;
}

说明

  1. 创建JSON对象:使用 QJsonObject 来构建JSON对象,并使用键值对填充数据。
  2. 创建JSON数组**:使用 QJsonArray 来创建一个数组,并添加元素。
  3. 组合JSON结构:将JSON数组添加到JSON对象中。
  4. 生成JSON文档:通过 QJsonDocument 来处理JSON数据,可以选择格式化(缩进)或压缩形式。
  5. 保存到文件:创建 QFile 对象,打开文件,写入JSON数据,并关闭文件。

这个例子展示了Qt中处理JSON的基础流程,包括创建、填充数据、转换为字符串,以及写入文件。您可以根据需要调整这个流程来适应更复杂的JSON结构或数据。

#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);QJsonObject rootObj;rootObj["cityid"] = "1010100";rootObj["date"] = "2024-01-23";rootObj["weather"] = "雨夹雪";rootObj["tmp"] = 3;QJsonArray jsonArray;jsonArray.append("data1");jsonArray.append("data2");jsonArray.append("data3");jsonArray.append(100);rootObj["testArry"] = jsonArray;QJsonDocument jsonDoc(rootObj);QByteArray jsonArry = jsonDoc.toJson();QFile file("D:/QT/test.json");file.open(QIODevice::WriteOnly);file.write(jsonArry);file.close();}
Widget::~Widget()
{delete ui;
}

​ 在JSON中,数组可以包含多种类型的元素,包括对象。当您在Qt中处理JSON数组,其中的元素是对象时,您可以使用 QJsonArray 和 QJsonObject 来创建和处理这些数据结构。以下是一个示例,展示了如何创建一个包含多个对象的JSON数组,并将该数组添加到一个JSON对象中。

示例:

#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);QJsonObject rootObj;rootObj["cityid"] = "1010100";rootObj["date"] = "2024-01-23";rootObj["weather"] = "雨夹雪";rootObj["tmp"] = 3;//Json数组QJsonArray jsonArray;jsonArray.append("data1");jsonArray.append("data2");jsonArray.append("data3");jsonArray.append(100);rootObj["testArry"] = jsonArray;QJsonObject alarmObj;alarmObj["alamType"] = "雪灾";alarmObj["alamLeve"] = "黄色";alarmObj["alamTitle"] = "福州市警告老陈多穿点衣服";rootObj["alam"] = alarmObj;QJsonObject day0;day0["day"] = "星期一";day0["wea"] = "晴";day0["tem"] = 5.7;QJsonObject day1;day1["day"] = "星期二";day1["wea"] = "晴";day1["tem"] = 7;QJsonObject day2;day2["day"] = "星期三";day2["wea"] = "多云";day2["tem"] = 17;QJsonArray dayArray;dayArray.append(day0);dayArray.append(day1);dayArray.append(day2);rootObj["days"] = dayArray;//通过QJsonDocument把JSON数据转换成QByteArrayQJsonDocument jsonDoc(rootObj);QByteArray jsonArry = jsonDoc.toJson();QFile file("D:/QT/test.json");file.open(QIODevice::WriteOnly);file.write(jsonArry);file.close();}
Widget::~Widget()
{delete ui;
}

QT解析JSON数据

​ 在Qt中解析JSON数据通常涉及到使用 QJsonDocumentQJsonObjectQJsonArray 类。这些类提供了处理JSON数据的必要工具,使您能够从JSON字符串中提取信息、遍历JSON对象或数组,并访问具体的数据项。以下是一个基本的示例,展示了如何在Qt中解析JSON字符串。

示例:解析JSON字符串

{
"name": "John Doe",
"age": 30,
"email": "john.doe@example.com",
"skills": ["C++", "Python", "JavaScript"]
}

以下是如何在Qt中解析这个JSON字符串的步骤:

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
void parseJson() {// JSON字符串/*
R 是用于定义原始字符串字面量(Raw String Literal)的标记。
在C++中,原始字符串字面量是一种方便的语法,
用于创建包含多行文本和特殊字符的字符串,而无需转义。
R"("chenlichen")"
*/QString testStr = "chenli\"c";QString jsonString = R"(
{
"name": "John Doe",
"age": 30,
"email": "john.doe@example.com",
"skills": ["C++", "Python", "JavaScript"]
}
)";/*jsonString = "{\n"
" \"name\": \"John Doe\",\n"
" \"age\": 30\n"
"}";
*/// 将JSON字符串转换为QJsonDocumentQJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());// 检查JSON文档是否包含一个对象if (!jsonDoc.isNull() && jsonDoc.isObject()) {// 获取JSON对象QJsonObject jsonObj = jsonDoc.object();// 访问对象的键值QString name = jsonObj["name"].toString();int age = jsonObj["age"].toInt();QString email = jsonObj["email"].toString();qDebug() << "Name:" << name;qDebug() << "Age:" << age;qDebug() << "Email:" << email;// 处理JSON数组if (jsonObj.contains("skills") && jsonObj["skills"].isArray()) {QJsonArray skillsArray = jsonObj["skills"].toArray();for (const QJsonValue &value : skillsArray) {qDebug() << "Skill:" << value.toString();}}} else {qDebug() << "Invalid JSON...";}
}
int main() {parseJson();return 0;
}

相关文章:

  • Linux阻塞与非阻塞I/O:从原理到实践详解
  • js中get,set用法
  • 深度学习 视觉处理(CNN) day_02
  • 力扣-206.反转链表
  • SecMulti-RAG:兼顾数据安全与智能检索的多源RAG框架,为企业构建不泄密的智能搜索引擎
  • 在 Spring Boot 项目中如何使用索引来优化 SQL 查询?
  • 再见,物理删除!MyBatis-Plus @TableLogic 优雅实现逻辑删除
  • 【ESP32S3】 下载时遇到 libusb_open() failed 解决方案
  • python如何取消word中的缩进
  • Unity3D IK解算器技术分析
  • 基于AIGC的3D场景生成实战:从文本描述到虚拟世界构建
  • BT150-ASEMI机器人率器件专用BT150
  • OceanBase 跻身 Forrester 三大领域代表厂商,全面支撑AI场景
  • 【C++游戏引擎开发】第24篇:级联阴影映射(CSM,Cascaded Shadow Maps)
  • springboot3 声明式 HTTP 接口
  • HTML 地理定位(Geolocation)教程
  • hadoop-3.3.5.tar.gz 镜像
  • OpenHarmony之电源模式定制开发指导
  • 策略模式(Strategy Pattern)详解
  • 2、Ubuntu 环境下安装RabbitMQ
  • 甘肃省原副省长赵金云被开除公职,甘肃省委表态:坚决拥护党中央决定
  • “五一”前多地市监部门告诫经营者:对预订客房不得毁约提价
  • 无视规范开“远端”、企业云端被窃密,国安部:莫让运维成运“危”
  • “80后”阿伯丁大学法学硕士朱江已任四川泸州市副市长
  • 王忠诚出任四川遂宁代市长,此前为成都市政府秘书长
  • 夸大事实拍视频发网络,镇雄两名网红勒索两千元删帖费被拘