10.王道_HTTP
1. 互联网时代的诞生
2. HTTP的基本特点
2.1客户端-服务端模型
2.2 无状态协议
2.3 可靠性
2.4 文本协议
3. HTML,CSS和JS
4. HTTP的各个组件
4.1 客户端
4.2 服务端
4.3 代理
5. URI和URL
6. HTTP报文
- HTTP报文分为两种——请求报文和响应报文。
6.1 GET请求示例
-
注意:C++中的类不用调用c中的mem_系列函数 来处理。
-
单线程阻塞服务端
#include <54func.h>#include <iostream>
#include<string>using std::cerr;
using std::string;class HttpServer
{
public:HttpServer(const string &ip,unsigned short port):_ip(ip),_port(port){}~HttpServer(){if(_sockfd>0){close(_sockfd);// 注意这里不需要作用域限定符号,而bind需要,因为std中也有bind函数}}void start();void recvAndShow();
private:string _ip;unsigned short _port;int _sockfd;
};void HttpServer::start()
{_sockfd = socket(AF_INET,SOCK_STREAM,0);if(_sockfd < 0){perror("socket");exit(1);}int reuse = 1;int ret = setsockopt(_sockfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse));if(ret < 0){perror("setsockfd");exit(1);}struct sockaddr_in serverAddr;memset(&serverAddr,0,sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(_port);serverAddr.sin_addr.s_addr = inet_addr(_ip.c_str());ret = ::bind(_sockfd,(struct sockaddr*)&serverAddr,sizeof(serverAddr));if(ret < 0){perror("bind");exit(1);}listen(_sockfd,10);
}void HttpServer::recvAndShow()
{while(true){int netfd = ::accept(_sockfd,nullptr,nullptr);char buf[4096] = {0};ssize_t sret = recv(netfd,buf,sizeof(buf),0);printf("sret = %ld,buf = %s\n",sret,buf);close(netfd);}
}int main()
{HttpServer server("10.102.1.35",1234);server.start();server.recvAndShow();return 0;
}
6.2 POST请求示例
6.3 请求报文详解
方法
路径
版本
- 1.0和1.1的区别
- HTTP2.0是二进制协议不是文本协议,典型的应用场景是grpc
首部字段
-
Content-Length,因为TCP是一个流式协议,需要使用类似于我们的火车头协议。包的长度。
-
Host:域名,处理一个IP对应多个域名的情况
-
Connection:长连接或者短连接
-
user-agent:客户端的类型
-
MIME
- 本质就是文件类型
- 格式:大类型/小类型:text/html,text/css,text/javascript
请求体
6.4 响应报文
响应的状态
- 200 ok
- 300配合浏览器生效,重定向
- 404找不到
- 403 客户端有错误
- 500 服务器有错误
#include <54func.h>#include <iostream>
#include<string>using std::cerr;
using std::string;class HttpServer
{
public:HttpServer(const string &ip,unsigned short port):_ip(ip),_port(port){}~HttpServer(){if(_sockfd>0){close(_sockfd);// 注意这里不需要作用域限定符号,而bind需要,因为std中也有bind函数}}void start();void recvAndShow();string response();
private:string _ip;unsigned short _port;int _sockfd;
};void HttpServer::start()
{_sockfd = socket(AF_INET,SOCK_STREAM,0);if(_sockfd < 0){perror("socket");exit(1);}int reuse = 1;int ret = setsockopt(_sockfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse));if(ret < 0){perror("setsockfd");exit(1);}struct sockaddr_in serverAddr;memset(&serverAddr,0,sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(_port);serverAddr.sin_addr.s_addr = inet_addr(_ip.c_str());ret = ::bind(_sockfd,(struct sockaddr*)&serverAddr,sizeof(serverAddr));if(ret < 0){perror("bind");exit(1);}listen(_sockfd,10);
}void HttpServer::recvAndShow()
{while(true){int netfd = ::accept(_sockfd,nullptr,nullptr);char buf[4096] = {0};ssize_t sret = recv(netfd,buf,sizeof(buf),0);printf("sret = %ld,buf = %s\n",sret,buf);string repo = response();send(netfd,repo.c_str(),repo.size(),0);close(netfd);}
}int main()
{HttpServer server("10.102.1.35",1234);server.start();server.recvAndShow();return 0;
}
string HttpServer::response()
{string startLine = "HTTP/1.1 200 ok\r\n";string headers = "Server: MyHttpServer\r\n";string body = "<html>Hello World!</html>";headers+="Content-Type: text/html \r\n";headers+="Content-Length" + std::to_string(body.size()) + "\r\n";string emptyLine = "\r\n";return startLine+headers+emptyLine+body;}
浏览器直接下载
- 重定向
7. RESTful的设计风格
目的:HTTP接口用起来像对象的方法调用
幂等性
- 重复发请求,对结果有无影响。
- get,delete,put是幂等的。
- post增加是不幂等的。
8. HTTPs的原理
8.1 对称加密和非对称加密
8.2 TLS的实现机制
- 两个步骤
- 1.非对称加密(引入证书机关)
-
- 对称加密
- 对称加密
TLS流程
!参考
-
HTTPS = HTTP + SSL(TLS)。
-
SSL 即安全套接层(Secure Sockets Layer),处于 OSI 七层模型中的会话层。
-
TLS握手的原因:为了验证身份、交换信息从而生成秘钥,为后续加密通信做准备。TLS 四次握手是在 TCP 建立连接之后进行的。因此,HTTPS 首次通信需要 7 次握手!
-
加密算法
- 对称加密:加、解密使用的同一串密钥,DES,AES 等。
- 非对称加密:加、解密使用不同的密钥,速度很慢,RSA,ECC 等。
- 混合加密:TLS 里使用了 “混合加密” 的方式博采众长:在通信刚开始的时候使用 非对称加密 算法,解决密钥交换的问题。后续全都使用 对称加密 进行通信。
-
数字证书(证书本身是由权威、受信任的证书颁发机构 (CA) 授予的。)一般有两个作用:
- 服务器向浏览器证明自己的身份,毕竟秘钥、甚至服务器域名都是可以伪造的。
- 把公钥传给浏览器。
-
RSA 握手(非对称加密)
1.浏览器向服务器发送随机数 client_random,TLS 版本和供筛选的加密套件列表。
2.服务器接收到,立即返回 server_random,确认好双方都支持的加密套件
以及数字证书 (证书中附带公钥 Public key certificate)。
3.浏览器接收,先验证数字证书。若通过,接着使用加密套件的密钥协商算法 RSA
算法生成另一个随机数 pre_random,并且用证书里的公钥加密,传给服务器。
4.服务器用私钥解密这个被加密后的 pre_random,参考 “非对称加密”。
XML
tinyxml2
#include <iostream>
#include"tinyxml2.h"using namespace tinyxml2;int main()
{XMLDocument doc;doc.LoadFile("test.xml");XMLElement *root = doc.FirstChildElement("sites");for(XMLElement *site = root->FirstChildElement("site"); site != nullptr; site=site->NextSiblingElement("site")){XMLElement *name = site->FirstChildElement("name");XMLElement *url = site->FirstChildElement("url");std::cerr<<"name:"<<name->GetText() <<",url:"<<url->GetText()<<std::endl;}return 0;
}
构建的代码
解析的代码
Json解析
简介
nlohmann/json的使用
-
nlohmann/json是一个header-only的C++ json解析库,可以用于构造和解析JSON对象。
-
键值必须是字符串
- 数据-》字节流:序列化/编码
- 字节流-》数据:反序列化。解码
{"sites":[{"site":{"name":"王道论坛","url":"www.baidu.com"}},{"site":{"name":"google","url":"www.google.com"}},{"site":{"name":"微博","url":"www.weibo.com"}}]
}
序列化
#include <iostream>
#include <nlohmann/json.hpp>
using Json = nlohmann::json;
int main(){Json sites1 ={{"sites",{{{"name", "王道论坛"}, {"url", "www.cskaoyan.com"}},{{"name", "google"}, {"url", "www.google.com"}},{{"name", "微博"}, {"url", "www.weibo.com"}}}}};Json sites2;sites2["sites"].push_back({{"name", "王道论坛"}, {"url","www.cskaoyan.com"}});sites2["sites"].push_back({{"name", "google"}, {"url", "www.google.com"}});sites2["sites"].push_back({{"name", "微博"}, {"url", "www.weibo.com"}});Json object;object["key1"] = "value1";object["key2"] = 2;// 使用[]运算符可以增加键值对// 使用push_back方法可以增加数组元素std::cout << sites1.dump() << "\n";std::cout << sites2.dump() << "\n";std::cout << object.dump() << "\n";
}
反序列化
#include <iostream>
#include<nlohmann/json.hpp>
using Json = nlohmann::json;
int main() {std::string json_string = R"({"sites":[{ "name":"王道论坛" , "url":"www.cskaoyan.com" },{ "name":"google" , "url":"www.google.com" },{ "name":"微博" , "url":"www.weibo.com" }]})";// 解析JSON字符串Json sites = Json::parse(json_string);// 遍历站点信息并打印for (const auto& site : sites["sites"]) {std::cout << "Name: " << site["name"] << ", URL: " << site["url"] <<std::endl;//另一种写法//std::cout << "Name: " << sites["sites"][i]["name"] << ", URL: " <<// sites["sites"][i]["url"] << std::endl;}
return 0;
}
相关文章:

10.王道_HTTP
1. 互联网时代的诞生 2. HTTP的基本特点 2.1客户端-服务端模型 2.2 无状态协议 2.3 可靠性 2.4 文本协议 3. HTML,CSS和JS 4. HTTP的各个组件 4.1 客户端 4.2 服务端 4.3 代理 5. URI和URL 6. HTTP报文 HTTP报文分为两种——请求报文和响应报文。 6.1 GET请求示例 注意&#…...

解决stm32HAL库使用vscode打开,识别不到头文件及uint8_t等问题
解决stm32HAL库使用vscode打开,识别不到头文件及uint8_t等问题 结论,问题有2问题1问题2解决办法将Keil Assistant自动生成的.vscode目录复制到MDK-ARM上层目录将Keil Assistant自动生成的.vscode目录复制到MDK-ARM上层目录将Keil Assistant自动生成的.vs…...
Docker Compose 完全指南:从入门到生产实践
Docker Compose 完全指南:从入门到生产实践 1. Docker Compose 简介与核心价值 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用的服务,只需简单命令就能创建和启动所有服务。 核心优势:…...
Android Framework 记录之一
1、下载源码,目录如下: 2、Android系统的层次如下: 3、项目目录简单分析如下: 4、telphony目录 文件描述CellIdentityCdma...

uniapp-商城-50-后台 商家信息(输入进行自定义规则验证)
本文介绍了如何在后台管理系统中添加和展示商家信息,包括商家logo、名称、电话、地址和介绍等内容,并支持后期上传营业许可等文件。通过使用uni-app的uni-forms组件,可以方便地实现表单的创建、校验和管理操作。文章详细说明了组件的引入、页…...
XSS ..
Web安全中的XSS攻击详细教学,Xss-Labs靶场通关全教程(建议收藏) - 白小雨 - 博客园跨站脚本攻击(XSS)主要是攻击者通过注入恶意脚本到网页中,当用户访问该页面时,恶意脚本会在用户的浏览器中执行…...

网页版部署MySQL + Qwen3-0.5B + Flask + Dify 工作流部署指南
1. 安装MySQL和PyMySQL 安装MySQL # 在Ubuntu/Debian上安装 sudo apt update sudo apt install mysql-server sudo mysql_secure_installation# 启动MySQL服务 sudo systemctl start mysql sudo systemctl enable mysql 安装PyMySQL pip install pymysql 使用 apt 安装 My…...

WEBSTORM前端 —— 第2章:CSS —— 第8节:网页制作2(小兔鲜儿)
目录 1.项目目录 2.SEO 三大标签 3.Favicon 图标 4.版心 5.快捷导航(shortcut) 6.头部(header) 7.底部(footer) 8.banner 9.banner – 圆点 10.新鲜好物(goods) 11.热门品牌(brand) 12.生鲜(fresh) 13.最新专题(topic) 1.项目目录 【xtx-pc】 ima…...

仓储车间安全革命:AI叉车防撞装置系统如何化解操作风险
在现代物流体系中,仓储承担着货物储存、保管、分拣和配送等重要任务。但现代仓储行业的安全现状却不容乐观,诸多痛点严重制约着其发展,其中叉车作业的安全问题尤为突出。相关数据显示,全球范围内,每年因叉车事故导致的…...
gin + es 实践 08
自动扩缩容 本文档详细介绍如何在Kubernetes环境中实现Go-ES应用的自动扩缩容,包括水平Pod自动扩缩容(HPA)、垂直Pod自动扩缩容(VPA)和集群自动扩缩容。 1. 自动扩缩容概述 自动扩缩容是指根据负载变化自动调整计算资源的过程,主要目标是:…...
在Postman中高效生成测试接口:从API文档到可执行测试的完整指南
引言 在API开发与测试流程中,Postman是一款高效的工具,能将API文档快速转化为可执行的测试用例。本文以《DBC协议管理接口文档》为例,详细讲解如何通过Postman实现接口的创建、配置、批量生成及自动化测试,帮助开发者和测试人员提升效率,确保接口质量。 一、准备工作:理…...

修改图像分辨率
在这个教程中,您将学习如何使用Python和深度学习技术来调整图像的分辨率。我们将从基础的图像处理技术开始,逐步深入到使用预训练的深度学习模型进行图像超分辨率处理。 一、常规修改方法 1. 安装Pillow库 首先,你需要确保你的Python环境中…...
2025.05.08-得物春招算法岗-第二题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 数字魔术分割 问题描述 LYA是一位数字魔术师,他有一个特殊的技能可以对任意一个正整数的数字进行重新排列,然后将排列后的数字序列分割成若干段,每段组成一个新的数字,最后…...
Node.js面试题
一、什么是Node.js? Node.js 是一个开源的跨平台 JavaScript 运行时环境,允许开发者在服务器端运行 JavaScript 代码。它基于 Chrome 的 V8 JavaScript 引擎构建,能够高效地处理 I/O 操作,适合构建高性能的网络应用。 异步非阻塞&…...
Spring MVC Controller 方法的返回类型有哪些?
Spring MVC Controller 方法的返回类型非常灵活,可以根据不同的需求返回多种类型的值。Spring MVC 会根据返回值的类型和相关的注解来决定如何处理响应。 以下是一些常见的 Controller 方法返回类型: String: 最常见的类型之一,用于返回逻辑…...

Redis 主从同步与对象模型(四)
目录 1.淘汰策略 1.1 expire/pexpire(设置键的过期时间) 1.2 配置 1.maxmemory 2.maxmemory-policy 3.maxmemory-samples 2.持久化 2.1背景 2.2 fork 的写时复制机制 2.3 大 key 3.持久化方式 3.1 aof(Apped Only File)…...

Linux系列:如何用perf跟踪.NET程序的mmap泄露
一:背景 1. 讲故事 如何跟踪.NET程序的mmap泄露,这个问题困扰了我差不多一年的时间,即使在官方的github库中也找不到切实可行的方案,更多海外大佬只是推荐valgrind这款工具,但这款工具底层原理是利用模拟器ÿ…...

如何租用服务器并通过ssh连接远程服务器终端
这里我使用的是智算云扉 没有打广告 但确实很便宜 还有二十小时免费额度 链接如下 注册之后 租用新实例 选择操作系统 选择显卡型号 点击租用 选择计费方式 选择镜像 如果跑深度学习的话 就选项目对应的torch版本 没有的话 就创建纯净的cuda 自己安装 点击创建实例 创建之后 …...
Git的核心作用详解
一、版本控制与历史追溯 Git作为分布式版本控制系统,其核心作用是记录代码的每一次修改,形成完整的历史记录。通过快照机制,Git会保存每次提交时所有文件的完整状态(而非仅记录差异),确保开发者可以随时回…...

华为设备链路聚合实验:网络工程实战指南
链路聚合就像为网络搭建 “并行高速路”,既能扩容带宽,又能保障链路冗余,超实用! 一、实验拓扑速览 图中两台交换机 LSW1 和 LSW2,PC1、PC2 归属 VLAN 10,PC3 归属 VLAN 30。LSW1 与 LSW2 通过 GE0/0/1、…...

AUTOSAR图解==>AUTOSAR_TR_AIDesignPatternsCatalogue
AUTOSAR 人工智能设计模式目录 AUTOSAR传感器执行器与仲裁设计模式的深入解析与图解 目录 简介传感器和执行器模式 架构概述组件结构交互流程应用场景 多请求者或提供者之间的仲裁模式 架构概述组件结构仲裁流程应用场景 总结 1. 简介 AUTOSAR(AUTomotive Open Sy…...
linux基础操作4------(权限管理)
一.前言 今天我们来讲讲linux的权限管理,比如文件的权限,如果大家看过前面说的app逆向的frida,我们在手机里要给frida,我们都要设置一下chomd 777 frida ,这样就给了可执行权限,这就是这一章要讲的&#x…...

双系统电脑中如何把ubuntu装进外接移动固态硬盘
电脑:win11 ubuntu22.04 实体机 虚拟机:VMware17 镜像文件:ubuntu-22.04.4-desktop-amd64.iso 或者 ubuntu20.4的镜像 外接固态硬盘1个 一、首先win11中安装vmware17 具体安装方法,网上很多教程 二、磁盘分区 1.在笔…...
Nacos源码—Nacos集群高可用分析(三)
6.CAP原则与Raft协议 (1)CAP分别指的是什么 一.C指的是一致性Consistency 各个集群节点之间的数据,必须要保证一致。 二.A指的是可用性Availability 在分布式架构中,每个请求都能在合理的时间内获得符合预期的响应。 三.P指的是分区容错性Partition To…...

【C语言】程序的预处理,#define详解
一、预定义符号 二、#define 1.#define定义标识符 #define + 自定义名称 + 代替的内容 例: #define MAX 100 #define CASE break;case #define CASE break;caseint main() {int n 0;switch (n){case 1:CASE 2:CASE 3:CASE 4:}return …...

NVM完全指南:安装、配置与最佳实践
发布于 2025年5月7日 • 阅读时间:10分钟 💡 TL;DR: 本文详细介绍了如何完整卸载旧版Node.js,安装NVM,配置阿里云镜像源,以及设置node_global与node_cache目录,打造高效Node.js开发环境。 📋 目…...

(二)毛子整洁架构(CQRS/Dapper/领域事件处理器/垂直切片)
文章目录 项目地址一、Application 层1.1 定义CQRS的接口以及其他服务1. Command2. IQuery查询3. 当前时间服务接口4. 邮件发送服务接口 1.2 ReserveBooking Command1. 处理传入的参数2. ReserveBookingCommandHandler3. BookingReservedDomainEvent 1.3 Query使用Sql查询1. 创…...
基于大核感知与非膨胀卷积的SPPF改进—融合UniRepLK的YOLOv8目标检测创新架构
在当前目标检测领域中,YOLO系列模型因其优异的速度-精度平衡能力而被广泛部署于工业界与科研场景。YOLOv8作为该系列的最新版本,在主干网络与特征金字塔结构上进行了多项优化,进一步提升了其实时性与鲁棒性。然而,其核心组件—SPPF(Spatial Pyramid Pooling Fast)模块仍采用…...
基于SpringBoot网上书店的设计与实现
pom.xml配置文件 1. 项目基本信息(没什么作用) <groupId>com.spring</groupId> <!--项目组织标识,通常对应包结构--> <artifactId>boot</artifactId> <!--项目唯一标识--> <version>0.0.1-SNAPSHOT</ve…...
小程序多线程实战
在小程序开发中,由于微信小程序的运行环境限制,原生并不支持传统意义上的多线程编程,但可以通过以下两种核心方案实现类似多线程的并发处理效果,尤其在处理复杂计算、避免主线程阻塞时非常关键: 一、官方方案ÿ…...