网络编程-网络原理HTTP1

文章目录

  • HTTP请求/响应的基本结构
  • 认识URL
    • URL是什么和基本格式
    • 关于encoding机制
  • 认识方法(method)
    • GET方法简介
    • GET方法的特点
    • POST方法简介
    • POST方法的特点
    • GET和POST的区别(经典面试题)
    • 关于GET和POST的补充说明
    • Restful风格


上节主要是对http协议的一些最基本的概念做出一些说明, 然后简单介绍了一下如何使用fiddler进行对http请求的抓取, 本节我们更加细致的解释一下HTTP的报文格式相关的问题


HTTP请求/响应的基本结构

我们抓一个包来简单查看一下

请求的基本结构如下

在这里插入图片描述

我们的HTTP请求分为下面的几个部分

  • 首行: 请求方法 + URL + 协议版本号
  • 请求头(header): 由键值对组成的结构
  • 空行: 作为header的结束标志, 分割请求头和正文
  • 正文(body): 可以携带信息, 可有可无的存在

响应的基本结构如下

在这里插入图片描述
和请求类似, 也分为四个部分

  • 首行: 协议版本号 + 状态码 + 状态码解释
  • 响应头(header): 由键值对组成的结构
  • 空行: 作为header的结束标志, 分割响应头和正文
  • 正文: 可以携带信息

认识URL

URL是什么和基本格式

URL的全程是Uniform Resource Locator 统⼀资源定位符, 描述了资源在网上的存在路径, 也就是说, 根据URL就可以找到某一个网络上的资源


URL的基本格式如下

协议方案名+(登录信息)+服务器地址(ip(域名)+端口号)
+带层次的文件路径+查询字符串(Quary String)+(片段标识符)

在这里插入图片描述

登录信息现在基本上不用了, 片段标识符用的也很少(文档类的网站还有)


我们拿访问leetcode平台的URL举例子

https://leetcode.cn/

我们访问的leetcode官网, 发现只有, 协议方案名+服务器地址(域名)

这说明URL中的好多内容都是可以省略的, 下面是URL中的内容以及是否可以省略

  • 协议方案名: 明确了当前通信使用的协议, 可以省略, 省略后默认是http://
  • ip地址/域名: 描述了请求的服务器的ip地址(域名), 可以省略, 在html中
  • 端口号: 描述了请求的服务器的目的端口, 可以省略, 省略之后相当于添加默认的端口号, http->80, https->443
  • 带层次的文件路径: 描述了请求的资源的更加具体的地址, 可以省略. 省略后相当于 / .
  • 查询字符串(Quary String): 使用键值对的格式进行存储, 详细的描述了请求的信息内容, 也可以传递一定的信息, 必要时使用encoding进行转码, 可以省略
  • 片段标识符: 可以省略

我们在使用leetcode平台抓一个URL看看

我们搜索了一个 'N皇后'
https://leetcode.cn/search/?q=N%E7%9A%87%E5%90%8E 

上面的URL中, 有 协议名称+域名(ip)+查询字符串(encoding转码了)


关于ip和域名的关系, 其实就是一回事, 因为ip地址不好被人们所记住使用, 所以想出来使用域名来代替ip地址, 二者通过一种叫做DNS应用层协议进行连接, 值得注意的是
DNS既是一种应用层协议, 也是一套服务器系统, 用来IP和域名之间的相互转换

我们想查询域名所对应的IP地址, 可以在cmd命令行中使用ping命令

ping + 域名

比如我们想查询 leetcode 平台域名对应的 ip 地址

在这里插入图片描述


关于空行的作用(这也是一个常见的面试题)

  • 因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空⾏就相当于是 “报头的结束标记”, 或者是"报头和正⽂之间的分隔符".
  • HTTP 在传输层依赖 TCP 协议, TCP 是⾯向字节流的. 如果没有这个空⾏, 就会出现 “粘包问题”.

关于encoding机制

因为URL在定义的时候, 有一些特殊的字符, 可能会影响解析的过程

所以一旦涉及到一些特殊的字符, 那可能就需要进行转码encoding操作, 即把转义的字符, 按照每个字节进行十六进制的转码, 然后在每一个字节前面加上%.

发送到服务器之后, 再进行decoding操作, 对转码的内容, 进行解码 从而可以找到对应的资源

但是发送到服务器之后, 进行decoding的操作, 一般都省略了, 因为我们开发中经常使用的spring系列的框架, 对这里的内容进行封装, 封装了解码的过程…


在浏览器上搜索C++

在这里插入图片描述
我们拿到上面的URL进行查看…
在这里插入图片描述
由于+号是特殊字符, 所以此处进行了URL encoding, 查询字符串中的C++变成了C%2B%2B
因为+对应的十六进制编码就是2B, 除了这种特殊符号, 包括一些非英文的语言(比如中文), 表情包, 也会进行encoding操作, 比如我们上面查询的N皇后就是使用了转码操作…


我们给一个URL解码的网站

URL解码

在这里插入图片描述
我们尝试解码上面的leetcode上的查询内容, 就会发现, 其实就是N皇后…

认识方法(method)

上面我们说到, 在请求的首行里面, 格式是请求方法+URL+协议版本号

方法表示了这个请求的相关作用

在这里插入图片描述
不同的方法代表不同的含义, 但是最常见的只有四个GET POST PUT DELETE
最常用的是 GETPOST

GET方法简介

GET方法的含义是, 获取某一种资源, 我们现在抓一个GET的请求看一看
尝试访问一个搜狗的网页

请求
在这里插入图片描述
响应
在这里插入图片描述
上面是使用GET请求获取到了一个网页的请求和响应


GET方法的特点

  • 首行的第一部分是GET
  • URL的Quary String可以为空, 也可以不为空
  • header部分有若干键值对结构
  • body部分为空(也可以不为空)
  • GET一般是幂等的…(一般情况)
  • body一般是空的, 如果需要给服务器发送一些数据, 可以通过Quary String进行传输

关于URL的长度问题

下面是引用的解释

关于 GET 请求的 URL ⻓度问题
⽹上有些资料上描述: get请求⻓度最多1024kb 这样的说法是错误的.
HTTP 协议由 RFC 2616 标准定义, 标准原⽂中明确说明: “Hypertext Transfer Protocol – HTTP/1.1,”
does not specify any requirement for URL length.
没有对 URL 的⻓度有任何的限制.
实际 URL 的⻓度取决于浏览器的实现和 HTTP 服务器端的实现. 在浏览器端, 不同的浏览器最⼤⻓度
是不同的, 但是现代浏览器⽀持的⻓度⼀般都很⻓; 在服务器端, ⼀般这个⻓度是可以配置的.

简单点说, 早期的浏览器版本不支持非常长的URL长度, 但是现在的URL以及完全没有长度的限制了…


关于为什么通常情况下GET方法设置为幂等的问题

幂等的含义就是, 同一个请求获取到的数据是相同的, 由于我们从服务器端获取到的数据, 通常情况下是相同的, 所以设置为幂等之后,
我们的本地就会缓存从服务器加载过来的数据, 从而在下次加载相同的内容的时候, 直接加载缓存到本地的资源就可以了, 从而加速了访问的速度, 传输层面的话, 也可以通过访问CDN服务器来加快访问服务器的过程(本质上是一种分布式存储机制)
如果真的想从新获取一遍资源, 就使用 ctrl + F5 强刷一下

但是随着互联网技术的进步, 很多时候, GET请求通常不设置为幂等的, 因为我们通常需要你的个性化推送这就意味着不能设置为幂等的…

POST方法简介

POST的语义是传输某一种数据信息, 通常使用body部分进行数据的传输, 关于POST最常见的场景就是, 登录, 上传
我们尝试抓取一个POST的信息来看一看

请求
在这里插入图片描述
响应

在这里插入图片描述

POST方法的特点

  • 首行的第一部分是POST
  • URL的Quary String一般为空(也可以不为空)
  • header部分有多个键值对结构
  • body部分一般不为空, 通过body来向服务器端传递信息

GET和POST的区别(经典面试题)

请你说说 GETPOST 的区别是什么

  • 语义不同:
    GET表示从服务器端获取一些资源, POST表示向服务器端提交一些资源
  • bodyQuary String 部分的不同
    GET请求的body部分通常为空(也可以不为空), POST的body部分通常不为空(也可以为空)
    GET请求的Quary String通常不为空(也可以为空), POST的Quary String通常为空(也可以不为空)
  • 传递数据方式的不同
    GET通过Quary String中的内容传递数据信息, POST通过body传递数据信息
  • 是否幂等(上面GET那里有解释)
    GET请求一般是幂等的, POST请求一般是不幂等的
  • 是否可以被缓存(和幂等相关)
    GET请求可以被缓存, POST请求不能被缓存

关于GET和POST的补充说明

  • 关于语义
    GET完全可以上传资源(通过Quary String), POST方法也可以获取资源(通过body), 所以在实际的开发中, 两个方法的使用并没有明确的界限

  • 关于幂等性
    GET的官方文档建议设置为幂等的, 但是我们实际的开发中也可以根据自己的需求进行开发, 比如主流的网站都有猜你喜欢功能…

  • 关于安全性
    有些资料说, GET不如POST安全, 这实际上是不合理的, 比如在登录的场景, 他的意思其实是, 如果使用GET进行传输, 密码信息会直接显示到浏览器的上面的地址栏, 所以不安全, 这显然是一种掩耳盗铃的说法…即使你通过POST传输, 我抓一个包也就全知道了, 所以POST也不是很安全, 我们正确的加密传输的方案是在业务层直接进行加密(HTTPS只能保证传输过程中是安全的)

  • 关于传输数据量
    有些资料说, GET传输的数据量不如POST多, 这实质上也是不严谨的, 我们现在的官方标准, 并没有规定GETURL的长度, 也没有规定POST中的body长度, 传输的数据量多少, 完全取决于不同浏览器和服务器的实现, 所以不能简单的说谁比谁传输数据少

  • 关于传输资源类型
    有的资料说, GET只能传输文本数据, POST不仅可以传输文本还可以传输二进制数据, 确实, GET中的URL中的Quary String只能是文本数据, 但是我们要想实现传输二进制的效果, 可以对二进制数据进行URL encoding操作转换为文本数据, 然后传输之后再进行decoding操作进行解码即可


Restful风格

尽管我们的方法之间并没有明确的界限, 但是我们还是遵循一套大致的流程, 分别CRUD操作

  • POST: 新增
  • DELETE: 删除
  • GET: 查询
  • PUT: 修改

在实际的开发中, 我们也可以尽量的遵循这种Restful设计风格来实现代码…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Facebook广告点击率CTR太低 如何优化

在投放Facebook广告的过程中,点击率CTR是一个衡量广告效果的重要指标,和广告质量、受众定位准确性、转化率等息息相关,因此,提升CTR是一个重要的广告优化流程。 一、什么是Facebook广告点击率,如何查看? C…

编写、应用中断例程

实验内容、程序清单及运行结果 编写、应用中断例程(课本实验13) 编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。 assume cs:code data segment db welcome to masm!,0 data ends code s…

WPF基础 | WPF 基础概念全解析:布局、控件与事件

WPF基础 | WPF 基础概念全解析:布局、控件与事件 一、前言二、WPF 布局系统2.1 布局的重要性与基本原理2.2 常见布局面板2.3 布局的测量与排列过程 三、WPF 控件3.1 控件概述与分类3.2 常见控件的属性、方法与事件3.3 自定义控件 四、WPF 事件4.1 路由事件概述4.2 事…

ssh密钥登录GitHub时一直提示“Error: Permission denied (publickey)”

起因 环境:Windows10 背景:之前就是按照官方说明创建个rsa密钥,在git后台添加上,就行了,近期怎么添加怎么失败,总是“Error: Permission denied (publickey)”的提示! 尝试 各种尝试&#xf…

ESP32S3基于espidf lvgl驱动i2c ssd1306/sh1106/7屏幕使用

ESP32S3基于espidf lvgl驱动i2c ssd1306/sh1106/7屏幕使用 🔖个人使用的espidf版本:V5.4,lvgl组件版本:8.3.0(可在idf_component.yml文件中看到) 对于 i2c ssd1306接口屏幕,可以直接使用自带的d…

C++ 复习总结记录十

C 复习总结记录十 主要内容 1、stack 介绍和使用 2、queue 介绍和使用 3、priority_queue 介绍和使用 4、容器适配器 一 stack 的介绍和使用 stack 文档介绍 1、 stack 是容器适配器,专用于后进先出的操作,只能从容器尾端进行元素插入和提取 2、…

ESP32服务器和PC客户端的Wi-Fi通信

ESP32客户端-服务器Wi-Fi通信 本指南将向您展示如何设置ESP32板作为服务端,PC作为客户端,通过HTTP通信,以通过Wi-Fi(无需路由器或互联网连接)交换数据。简而言之,您将学习如何使用HTTP请求将一个板的数据发…

激光雷达和相机早期融合

通过外参和内参的标定将激光雷达的点云投影到图像上。 • 传感器标定 首先需要对激光雷达和相机(用于获取 2D 图像)进行外参和内参标定。这是为了确定激光雷达坐标系和相机坐标系之间的转换关系,包括旋转和平移。通常采用棋盘格等标定工具&…

机器学习-核函数(Kernel Function)

核函数(Kernel Function)是一种数学函数,主要用于将数据映射到一个更高维的特征空间,以便于在这个新特征空间中更容易找到数据的结构或模式。核函数的主要作用是在不需要显式计算高维特征空间的情况下,通过内积操作来实…

【基于无线电的数据通信链】Link 11 仿真测试

〇、废话 Link 11 仿真测试 涉及多个方面,包括信号仿真、协议模拟、数据链路层的仿真以及网络性能评估等。Link 11 是一种基于 HF(高频) 或 UHF(超高频) 波段的无线通信协议,主要用于军事通信系统中。为了…

计算机图形学:实验四 带纹理的OBJ文件读取和显示

一、程序功能设计 在程序中读取带纹理的obj文件,载入相应的纹理图片文件,将带纹理的模型显示在程序窗口中。实现带纹理的OBJ文件读取与显示功能,具体设计如下: OBJ文件解析与数据存储 通过实现TriMesh类中的readObj函数&#x…

【PVE】Proxmox VE8.0+创建LXC容器安装docker

为了不影响PVE宿主机,通常使用套娃的形式安装Docker容器,再安装相关docker应用。首先在CT模板中创建 Linux 容器,推荐使用Debian。开启ssh登录,修改debian配置,安装docker 一、创建 LXC 容器 1、CT模板下载 点击“模…

如何为64位LabVIEW配置正确的驱动程序

在安装 64位 LabVIEW 后,确保驱动程序正确配置是关键。如果您首先安装了 32位 LabVIEW 和相关驱动,然后安装了 64位 LabVIEW,需要确保为 64位 LabVIEW 安装和配置适当的驱动程序,才能正常访问硬件设备。以下是详细步骤&#xff1a…

MVCC底层原理实现

MVCC的实现原理 了解实现原理之前,先理解下面几个组件的内容 1、 当前读和快照读 先普及一下什么是当前读和快照读。 当前读:读取数据的最新版本,并对数据进行加锁。 例如:insert、update、delete、select for update、 sele…

设计模式-建造者模式、原型模式

目录 建造者模式 定义 类图 优缺点 角色 建造者模式和工厂模式比较 使用案例 原型模式 定义 类图 优缺点 应用场景 应用类型 浅克隆 深克隆 建造者模式 定义 将一个复杂的对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,…

Midscene.js:重新定义UI自动化的新时代工具

前言 Midscene.js 是一个创新的、面向开发者的 UI 自动化解决方案,并通过人工智能技术简化自动化脚本的编写与维护。 它提供了三种核心方法——交互(.ai, .aiAction)、提取(.aiQuery)和断言(.aiAssert&am…

【落羽的落羽 数据结构篇】算法复杂度

文章目录 一、数据结构和算法简介二、算法复杂度1. 时间复杂度2. 空间复杂度 一、数据结构和算法简介 数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用,所以我们要学…

如何使用tushare pro获取股票数据——附爬虫代码以及tushare积分获取方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据 总结 一、Tushare 介绍 Tushare 是一个提供中国股市数据的API接口服务,它允许用户…

Java 实现Excel转HTML、或HTML转Excel

Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,以便更好地利用和展示数据。本文将介绍如何通过 Java 实现 E…

迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-添加内核编译

编译内核时将该 HDF 驱动编译到镜像中,接下来编写驱动编译脚本 Makefile,代码如下所示: 加入编译体系,填加模块目录到 drivers/hdf_core/adapter/khdf/linux/Makefile 文件 更多内容可以关注:迅为RK3568开发板篇OpenHa…