10.王道_HTTP

news2025/5/13 0:53:21

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.非对称加密(引入证书机关)
    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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决stm32HAL库使用vscode打开,识别不到头文件及uint8_t等问题

解决stm32HAL库使用vscode打开&#xff0c;识别不到头文件及uint8_t等问题 结论&#xff0c;问题有2问题1问题2解决办法将Keil Assistant自动生成的.vscode目录复制到MDK-ARM上层目录将Keil Assistant自动生成的.vscode目录复制到MDK-ARM上层目录将Keil Assistant自动生成的.vs…

uniapp-商城-50-后台 商家信息(输入进行自定义规则验证)

本文介绍了如何在后台管理系统中添加和展示商家信息&#xff0c;包括商家logo、名称、电话、地址和介绍等内容&#xff0c;并支持后期上传营业许可等文件。通过使用uni-app的uni-forms组件&#xff0c;可以方便地实现表单的创建、校验和管理操作。文章详细说明了组件的引入、页…

网页版部署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叉车防撞装置系统如何化解操作风险

在现代物流体系中&#xff0c;仓储承担着货物储存、保管、分拣和配送等重要任务。但现代仓储行业的安全现状却不容乐观&#xff0c;诸多痛点严重制约着其发展&#xff0c;其中叉车作业的安全问题尤为突出。相关数据显示&#xff0c;全球范围内&#xff0c;每年因叉车事故导致的…

修改图像分辨率

在这个教程中&#xff0c;您将学习如何使用Python和深度学习技术来调整图像的分辨率。我们将从基础的图像处理技术开始&#xff0c;逐步深入到使用预训练的深度学习模型进行图像超分辨率处理。 一、常规修改方法 1. 安装Pillow库 首先&#xff0c;你需要确保你的Python环境中…

Redis 主从同步与对象模型(四)

目录 1.淘汰策略 1.1 expire/pexpire&#xff08;设置键的过期时间&#xff09; 1.2 配置 1.maxmemory 2.maxmemory-policy 3.maxmemory-samples 2.持久化 2.1背景 2.2 fork 的写时复制机制 2.3 大 key 3.持久化方式 3.1 aof&#xff08;Apped Only File&#xff09…

Linux系列:如何用perf跟踪.NET程序的mmap泄露

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

如何租用服务器并通过ssh连接远程服务器终端

这里我使用的是智算云扉 没有打广告 但确实很便宜 还有二十小时免费额度 链接如下 注册之后 租用新实例 选择操作系统 选择显卡型号 点击租用 选择计费方式 选择镜像 如果跑深度学习的话 就选项目对应的torch版本 没有的话 就创建纯净的cuda 自己安装 点击创建实例 创建之后 …

华为设备链路聚合实验:网络工程实战指南

链路聚合就像为网络搭建 “并行高速路”&#xff0c;既能扩容带宽&#xff0c;又能保障链路冗余&#xff0c;超实用&#xff01; 一、实验拓扑速览 图中两台交换机 LSW1 和 LSW2&#xff0c;PC1、PC2 归属 VLAN 10&#xff0c;PC3 归属 VLAN 30。LSW1 与 LSW2 通过 GE0/0/1、…

AUTOSAR图解==>AUTOSAR_TR_AIDesignPatternsCatalogue

AUTOSAR 人工智能设计模式目录 AUTOSAR传感器执行器与仲裁设计模式的深入解析与图解 目录 简介传感器和执行器模式 架构概述组件结构交互流程应用场景 多请求者或提供者之间的仲裁模式 架构概述组件结构仲裁流程应用场景 总结 1. 简介 AUTOSAR&#xff08;AUTomotive Open Sy…

双系统电脑中如何把ubuntu装进外接移动固态硬盘

电脑&#xff1a;win11 ubuntu22.04 实体机 虚拟机&#xff1a;VMware17 镜像文件&#xff1a;ubuntu-22.04.4-desktop-amd64.iso 或者 ubuntu20.4的镜像 外接固态硬盘1个 一、首先win11中安装vmware17 具体安装方法&#xff0c;网上很多教程 二、磁盘分区 1.在笔…

【C语言】程序的预处理,#define详解

一、预定义符号 二、#define 1.#define定义标识符 #define &#xff0b; 自定义名称 &#xff0b; 代替的内容 例&#xff1a; #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日 • 阅读时间&#xff1a;10分钟 &#x1f4a1; TL;DR: 本文详细介绍了如何完整卸载旧版Node.js&#xff0c;安装NVM&#xff0c;配置阿里云镜像源&#xff0c;以及设置node_global与node_cache目录&#xff0c;打造高效Node.js开发环境。 &#x1f4cb; 目…

(二)毛子整洁架构(CQRS/Dapper/领域事件处理器/垂直切片)

文章目录 项目地址一、Application 层1.1 定义CQRS的接口以及其他服务1. Command2. IQuery查询3. 当前时间服务接口4. 邮件发送服务接口 1.2 ReserveBooking Command1. 处理传入的参数2. ReserveBookingCommandHandler3. BookingReservedDomainEvent 1.3 Query使用Sql查询1. 创…

如何修改MySQL数据库密码

文章目录 一、忘记数据库密码该如何修改1. 关闭数据库的服务2.跳过安全检查3. 重置密码4.查询用户是否存在5.退出验证密码是否正确 二、未忘记密码该如何修改密码1.直接修改密码2.登录mysql 时间久了&#xff0c;忘记数据库密码了。。。。。 一、忘记数据库密码该如何修改 1. …

【Python】mat npy npz 文件格式

1、简介 MAT 文件和 NP&#xff08;.npy 或 .npz&#xff09;文件是两种不同的格式&#xff0c;用于存储数组数据。它们分别由 MATLAB 和 NumPy 开发&#xff0c;主要用于各自环境中的数据存储和交换。以下是这两种格式的主要区别&#xff1a; 1.1 格式和用途 MAT 文件&…

SpringBoot快速入门WebSocket(​​JSR-356附Demo源码)

现在我想写一篇Java快速入门WebSocket,就使用 JSR-356的websocket,我想分以下几点, 1. websocket介绍, 1.1 介绍 什么是WebSocket&#xff1f;​​ WebSocket 是一种基于 ​​TCP​​ 的​​全双工通信协议​​&#xff0c;允许客户端和服务器在​​单个长连接​​上实…

【安装配置教程】ubuntu安装配置Kodbox

目录 一、引言 二、环境配置 1. 服务器配置​ 2. 必备组件​ 三、安装基础环境​ 1. 安装 PHP 8.1 及扩展​ 2. 安装 MySQL 数据库 3.安装 Redis&#xff08;可选&#xff0c;提升缓存性能&#xff09; 4. 配置nginx文件 4.1. 创建 Kodbox 站点目录​ 4.2. 编写 Ng…

LabVIEW车牌自动识别系统

在智能交通快速发展的时代&#xff0c;车牌自动识别系统成为提升交通管理效率的关键技术。本案例详细介绍了基于 LabVIEW 平台&#xff0c;搭配大恒品牌相机构建的车牌自动识别系统&#xff0c;该系统在多个场景中发挥着重要作用&#xff0c;为交通管理提供了高效、精准的解决方…