【网络面试篇】HTTP(1)(笔记)——状态码、字段、GET、POST、缓存
目录
一、相关问题
1. HTTP请求常见的状态码和字段?
(1)状态码
(2)字段
① Host 字段
② Content-length 字段
③ Connection 字段
④ Content-Type 字段
⑤ Content-Encoding 字段
2. GET 和 POST 的区别?
(1)作用不同
(2)参数传递方式不同
(3)安全性不同
(4)参数长度限制不同
(5)编码方式不同
(6)缓存机制不同
(7)时间消耗不同
3. GET 和 POST 方法都是安全和幂等的吗?
4. 什么是强缓存和协商缓存?
(1)强制缓存
(2)协商缓存
① 使用 ETag 字段实现的协商缓存过程
② 使用 last-modified 实现的协商缓存过程
一、相关问题
1. HTTP请求常见的状态码和字段?
(1)状态码
1xx 类状态码 属于提示信息,是 协议处理中的 一种 中间状态,实际 用到的比较少。
2xx 类状态码 表示服务器 成功处理了 客户端的请求,也是我们 最愿意看到的 状态。
- 「200 OK」是 最常见的 成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的 响应头 都会有 body 数据。
- 「204 No Content」也是 常见的 成功状态码,与 200 OK 基本相同,但 响应头 没有 body 数据。
- 「206 Partial Content」是应用于 HTTP 分块下载 或 断点续传,表示应 返回的 body 数据 并不是 资源的 全部,而是 其中的 一部分,也是 服务器 处理成功的 状态。
3xx 类状态码 表示客户端 请求的资源 发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。
- 「301 Moved Permanently」表示 永久 重定向,说明 请求的资源 已经 不存在了,需 改用新的 URL 再次访问。
- 「302 Found」表示 临时 重定向,说明 请求的 资源还在,但 暂时 需要用 另一个 URL 来访问。301 和 302 都会 在 响应头 里 使用 字段 Location ,指明 后续要 跳转的 URL,浏览器 会自动重定向 新的 URL。
- 「304 Not Modified」不具有 跳转的 含义,表示 资源 未修改,重定向 已存在的 缓冲文件,也称 缓存 重定向,也就是 告诉 客户端可以 继续使用 缓存资源,用于 缓存控制。
4xx 类状态码 表示客户端 发送的 报文有误,服务器 无法处理,也就是 错误码 的含义。
- 「400 Bad Request」表示 客户端请求的 报文有错误,但只是个 笼统的 错误。
- 「403 Forbidden」表示 服务器禁止 访问资源,并不是 客户端的 请求出错。
- 「404 Not Found」表示 请求的资源 在服务器上 不存在 或 未找到,所以 无法提供给 客户端。
5xx 类状态码 表示客户端 请求报文正确,但是 服务器 处理时 内部发生了 错误,属于 服务器端的 错误码。
- 「500 Internal Server Error」与 400 类型,是个 笼统通用的 错误码,服务器 发生了 什么错误,我们 并不知道。
- 「501 Not Implemented」表示 客户端 请求的 功能 还不支持,类似 “即将开业,敬请期待" 的意思。
- 「502 Bad Gateway」通常是 服务器作为 网关 或 代理 时返回的 错误码,表示 服务器 自身工作正常,访问 后端服务器 发生了 错误。
- 「503 Service Unavailable」表示 服务器 当前很忙,暂时 无法响应 客户端,类似 “网络服务正忙,请稍后重试” 的意思。
(2)字段
① Host 字段
客户端发送 请求时,用来指定服务器的 域名。
有了 Host 字段,就可以 将 请求发往「同一台」服务器上的 不同网站。
② Content-length 字段
服务器在 返回数据时,会有 Content-Length 字段,表明本次回应的数据长度。
如上面是 告诉浏览器,本次 服务器回应的 数据长度是 1000 个字节,后面的字节就属于下一个回应了。
③ Connection 字段
Connection 字段最常用于 客户端 要求 服务器使用「HTTP 长连接」机制,以便 其他 请求复用。
④ Content-Type 字段
Content-Type 字段用于 服务器 回应时,告诉 客户端,本次数据是什 么格式。
上面的 类型表明,发送的是 网页,而且 编码 是 UTF-8。
⑤ Content-Encoding 字段
Content-Encoding 字段说明 数据的 压缩方法。表示 服务器 返回的 数据 使用了 什么 压缩格式。
上面 表示 服务器 返回的数据 采用了 gzip 方式压缩,告知 客户端 需要用 此方式 解压。
客户端 在请求时,用 Accept-Encoding 字段说明 自己可以接 受哪些 压缩方法。
2. GET 和 POST 的区别?
(1)作用不同
- GET 用于从服务端 获取资源。
- POST 一般用来 向服务器端 提交数据。
(2)参数传递方式不同
- GET 请求的参数 一般写在 URL 中,且只接受 ASCII 字符。
- POST 请求参数 一般放在请求体中,对于 数据类型也 没有限制。
(3)安全性不同
因为 参数传递方式的 不同,所以 两者安全性不同,GET 请求的 参数 直接暴露在 URL 中,所以 更不安全,不能用来 传递 敏感信息。
(4)参数长度限制不同
- GET 传送的 数据量较小,不能大于2KB。
- POST 传送的 数据量较大,一般被默认为不受限制。
- HTTP 协议没有 Body 和 URL 的长度限制,对 URL 限制的大多是浏览器和服务器的 原因。
(5)编码方式不同
- GET 请求 只能进行 URL 编码 (application/x-www-form-urlencoded)
- POST 支持 多种 编码方式 (application/x-www-form-urlencoded 或 multipart/form-data,二进制数据 使用 多种编码)
(6)缓存机制不同
- GET 请求会 被浏览器 主动 cache,而 POST 不会,除非 手动设置。
- GET 请求参数会 被完整 保留在 浏览器 历史记录 里,而 POST 中的参数 不会 被保留。
- GET 产生的 URL 地址可以被 保存为书签,而 POST 不可以。
- GET 在浏览器 回退时是 无害的,而 POST 会 再次 提交请求。
(7)时间消耗不同
- GET 产生一个 TCP 数据包。
- POST 产生两个 TCP 数据包。
- 对于 GET 方式的请求,浏览器 会把 header 和 data 一并发送出去,服务器响应 200(返回数据)。
- 而对于 POST,浏览器先发送 Header,服务器响应 100 continue,浏览器 再发送 data,服务器响应 200 ok(返回数据)。
3. GET 和 POST 方法都是安全和幂等的吗?
安全和幂等的概念:
- 在 HTTP 协议里,所谓的「安全」是指 请求方法 不会「破坏」服务器上的 资源。
- 所谓的「幂等」,意思是 多次执行 相同的操作,结果 都是「相同」的。
从 RFC 规范 定义的语义 来看:
- GET 方法就是 安全 且 幂等的,因为它是「只读」操作,无论 操作 多少次,服务器上的 数据都是 安全的,且 每次的结果 都是相同的。所以,可以对 GET 请求的 数据 做缓存,这个 缓存 可以做到 浏览器 本身上(彻底 避免浏览器 发请求),也可以 做到 代理上(如 nginx),而且在 浏览器中 GET 请求可以 保存为 书签。
- POST 因为是「新增 或 提交数据」的操作,会 修改服务器上的 资源,所以是 不安全的,且多次 提交数据 就会创建 多个资源,所以 不是幂等的。所以,浏览器 一般不会 缓存 POST 请求,也 不能把 POST 请求保存为书签。
小结:
- GET 的 语义是 请求获取 指定的资源。GET 方法是 安全、幂等、可被缓存的。
- POST 的 语义是 根据 请求负荷(报文主体)对 指定的资源 做出处理,具体的 处理方式 视资源类型 而不同。POST 不安全,不幂等,(大部分实现)不可缓存。
4. 什么是强缓存和协商缓存?
对于一些 具有 重复性的 HTTP 请求,比如 每次请求 得到的 数据 都一样的,我们 可以把 这对「请求-响应」的数据都 缓存在 本地,那么下次就 直接读取 本地的 数据,不必在 通过网络 获取 服务器的 响应了,这样的话 HTTP/1.1 的性能 肯定 肉眼可见的 提升。
所以,避免发送 HTTP 请求的方法 就是 通过 缓存技术,HTTP 设计者早 在之前就 考虑到了这点,因此 HTTP 协议的头部有不少是针对缓存的字段。HTTP 缓存有两种实现方式,分别是 强制缓存 和 协商缓存。
(1)强制缓存
强缓存 就是 浏览器本地 根据服务器 设置的 过期时间 来判断 是否 使用缓存,决定 是否 使用 缓存的主动性 在于浏览器 这边。如下图中,返回的是 200 状态码,但在 size 项中标识的是 from disk cache,就是使用了强制缓存。
强缓存是 利用下面这 两个 HTTP 响应头部(Response Header)字段 实现的,它们都 用来 表示资源 在客户端 缓存的 有效期:
- Cache-Control,是一个 相对时间;
- Expires,是一个 绝对时间;
如果 HTTP 响应头部 同时 有 Cache-Control 和 Expires 字段的话,Cache-Control 的优先级高于 Expires。
Cache-control 选项 更多一些,设置 更加 精细,所以 建议 使用 Cache-Control 来实现 强缓存。具体的 实现流程如下:
- 当 浏览器 第一次 请求访问 服务器资源时,服务器 会在 返回 这个资源的 同时,在 Response 头部加上 Cache-Control,Cache-Control 中设置了 过期时间 大小;
- 浏览器 再次请求 访问服务器中的 该资源时,会 先通过 请求资源的 时间 与 Cache-Control 中设置的 过期时间 大小,来 计算出 该资源 是否过期,如果没有,则 使用 该缓存,否则 重新 请求服务器;
- 服务器 再次 收到请求后,会 再次更新 Response 头部的 Cache-Control。
(2)协商缓存
当在浏览器 使用 开发者工具的时候,可能会看到过 某些请求的 响应码是 304,这个是 告诉 浏览器 可以使用 本地缓存的 资源,通常 这种通过 服务端 告知 客户端 是否可以 使用缓存的 方式 被称为 协商缓存。
上图就是一个 协商缓存 的过程,所以 协商缓存 就是 与 服务端协商 之后,通过 协商结果 来判断是否 使用 本地缓存,即 浏览器每一次都要 发送请求 到 服务器询问 是否使用缓存。协商缓存可以 基于 两种头部 来实现。
第一种:请求头部中的 If-Modified-Since 字段 与 响应头部中的 Last-Modified 字段 实现,这两个字段的 意思是:
- 响应头部 中的 Last-Modified:标示 这个 响应资源 的最后 修改时间;
- 请求头部 中的 If-Modified-Since:当 资源过期了,发现 响应头中 具有 Last-Modified 声明,则再次 发起请求的 时候 带上 Last-Modified 的时间,服务器 收到 请求后 发现有 If-Modified-Since 则 与 被请求资源的 最后 修改时间 进行对比(Last-Modified),如果 最后 修改时间 较新(大),说明 资源 又被改过,则 返回最新 资源,HTTP 200 OK;如果 最后 修改 时间 较旧(小),说明 资源 无新修改,响应 HTTP 304 走缓存。
第二种:请求头部中的 If-None-Match 字段 与 响应头部 中的 ETag 字段,这 两个字段 的意思是:
- 响应头部中 Etag:唯一标识 响应资源;
- 请求头部中的 If-None-Match:当资源过期时,浏览器 发现 响应头 里有 Etag,则 再次向 服务器 发起 请求时,会将 请求头 If-None-Match 值 设置为 Etag 的值。服务器 收到 请求后 进行比对,如果 资源 没有变化 返回 304,如果 资源 变化了 返回 200。
第一种 实现方式 是 基于 时间 实现的,第二种 实现方式 是 基于 一个唯一标识 实现的,相对来说 后者 可以 更加准确地 判断 文件内容 是否 被修改,避免 由于 时间篡改 导致的 不可靠问题。
注意:协商缓存这 两个字段 都需要 配合 强制缓存 中 Cache-Control 字段来使用,只有 在 未能命中 强制缓存 的时候,才能 发起带有 协商缓存 字段的请求。
① 使用 ETag 字段实现的协商缓存过程
- 当浏览器 初次请求 访问 服务器资源 时,服务器 会在 返回这个资源的 同时,同时 生成 一个 Etag 值 携带在 响应头 里 返回给浏览器,这个 唯一标识的值是 根据 当前请求的 资源生成的。
- 当 浏览器 再次 请求访问服务器 中的该资源时,首先会先 检查强制 缓存 是否过期。如果没有过期,则直接使用 本地缓存;如果 缓存过期了,会在 请求头 加上 If-None-Match 字段,该字段的值就是之前 服务器 返回的 Etag 的值。
- 服务器收到 之后 拿该值 与 资源文件 最新的 Etag 值 做对比。如果 没有变化 则返回 304,告诉 浏览器 继续 使用缓存(不返回 资源文件);如果变化,则返回 200 状态码 和 资源,并在 请求头 加上新的 ETag 值。
② 使用 last-modified 实现的协商缓存过程
- 当浏览器 初次请求 访问 服务器资源 时,服务器端 读出文件修改时间,将 读出来的 修改时间 赋给 响应头的 last-modified 字段,返回给浏览器。
- 当 客户端 读取到 last-modified 的时候,会在 下次的 请求标头中 携带 If-Modified-Since 字段,而 这个 请求头中的 If-Modified-Since 就是之前 服务器返回的 last-modified 字段。
- 和 ETag 字段相同的,之后 每次对 该资源的 请求,都会 带上 If-Modified-Since 这个字段。而 服务端 就需要拿 其中表示时间 与最新 读取 该资源的 修改时间进行对比,来决定是 读取缓存 还是 返回 新的资源。
如果 在第一次 请求资源的 时候,服务端 返回的 HTTP 响应头部 同时有 Etag 和 Last-Modified 字段,那么 客户端 再下一次 请求的 时候,如果 带上了 ETag 和 Last-Modified 字段 信息 给服务端,这时 Etag 的 优先级 更高,也就是 服务端 先会 判断 Etag 是否 变化了,如果 Etag 有变化 就不用 在判断 Last-Modified 了,如果 Etag 没有变化,然后 再看 Last-Modified。
相关文章:

【网络面试篇】HTTP(1)(笔记)——状态码、字段、GET、POST、缓存
目录 一、相关问题 1. HTTP请求常见的状态码和字段? (1)状态码 (2)字段 ① Host 字段 ② Content-length 字段 ③ Connection 字段 ④ Content-Type 字段 ⑤ Content-Encoding 字段 2. GET 和 POST 的区别&a…...

HTML 基础标签——分组标签 <div>、<span> 和基础语义容器
文章目录 1. `<div>` 标签特点用途示例2. `<span>` 标签特点用途示例3. `<fieldset>` 标签特点用途示例4. `<section>` 标签特点用途示例5. `<article>` 标签特点用途示例总结HTML中的分组(容器)标签用于结构化内容,将页面元素组织成逻辑区域…...

SS928V100 ISP常见问题列表
下载链接: https://download.csdn.net/download/quantum7/89948226 1 FAQ 1 1.1 ISP 1 1.1.1 如何解决整体锐度不足 1 1.1.2 如何解决图像发蒙问题,提高通透性 2 1.1.3 如何解决低照度清晰度差 2 1.1.4 如何解决图像清晰度与物体边缘白边和黑边问题…...

AI写诗:自动版大唐宫体诗
大唐学子,手拿一本小卷(类书),从中挑选过去他们(权威)认为好的词来拼接一首诗,此类诗词称作“宫体诗”,在初唐时期甚是流行。 写“宫体诗”的过程有木有那么一丝丝的熟悉?…...

Java复习31(PTA)
sdust-Java-字符串集合求并集 分数 15 全屏浏览 切换布局 作者 张峰 单位 山东科技大学 从键盘接收N个英文字符串(其中不同的字符串数量大于10),从头开始取5个不同的字符串放入一个集合S1,然后接着取5个不同的字符串放入另一个…...

【Linux系列】Linux 系统中的软连接管理
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

@layer(级联层)
在css样式表(文件)中声明layer为样式添加级联层,其意义在于可以使用它重新定义样式的叠层关系. layer后声明的级联层里面的样式将覆盖前声明的级联层里面的相同属性.在级联层外声明的样式会覆盖级联层里面的相同属性样式,同一层级里面的样式冲突,依然按照优先级来计算. 在级联层…...

nginx代理websocket服务
一、nginx代理websocket服务 一)nginx代理ws服务 在nginx中,可以通过proxy_pass指令来代理WebSocket服务。 以下是一个示例配置: map $http_upgrade $connection_upgrade {default upgrade; close; }upstream ws_backend {server 127.0.0.1:…...

第二十七章 Vue异步更新之$nextTick
目录 一、概述 二、完整代码 2.1. main.js 2.2. App.vue 一、概述 需求:编辑标题, 弹出显示编辑框自动聚焦 1. 点击编辑,显示编辑框 2. 让编辑框,立刻获取焦点 我们常规的思路可能会编写如下代码来实现: 问题:…...

【51 Pandas+Pyecharts | 深圳市共享单车数据分析可视化】
文章目录 🏳️🌈 1. 导入模块🏳️🌈 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 处理起始时间、结束时间2.4 增加骑行时长区间列2.5 增加骑行里程区间列 🏳️🌈 3. Pyecharts数据可视化3.1 各…...

【Clikhouse 探秘】ClickHouse 物化视图:加速大数据分析的新利器
👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…...

线程相关题(线程池、线程使用、核心线程数的设置)
目录 线程安全的什么情况用?情况下用线程安全的类? 线程池线程方面的优化 线程池调优主要涉及以下几个关键参数。 线程不安全原因? 1. 共享资源访问冲突 2. 缺乏原子操作 3. 内存可见性问题 4. 重排序问题 如何解决线程不安全的问题࿱…...

2181、合并零之间的节点
2181、[中等] 合并零之间的节点 1、问题描述: 给你一个链表的头节点 head ,该链表包含由 0 分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val 0 。 对于每两个相邻的 0 ,请你将它们之间的所有节点合并成一个节点ÿ…...

powerlaw:用于分析幂律分布的Python库
引言 幂律分布在游戏行业中非常重要。在免费游戏模式下,玩家的付费行为往往遵循幂律分布。少数“鲸鱼玩家”贡献了大部分的收入,而大多数玩家可能只进行少量或不进行付费。通过理解和应用幂律分布,游戏开发者可以更好地分析和预测玩家行为&a…...

工作管理实战指南:利用Jira、Confluence等Atlassian工具打破信息孤岛,增强团队协作【含免费指南】
如果工作场所存在超级反派,其中之一可能会被命名为“信息孤岛”,因为它们能够对公司的生产力和协作造成严重破坏。当公司决定使用太多互不关联的工具来完成工作时,“信息孤岛”就会出现,导致团队需要耗费大量时间才能就某件事情达…...

JAVA语言多态和动态语言实现原理
JAVA语言多态和动态语言实现原理 前言invoke指令invokestaticinvokespecialinvokevirtualinvokeintefaceinvokedynamicLambda 总结 前言 我们编码java文件,javac编译class文件,java运行class,JVM执行main方法,加载链接初始化对应…...

阿里云-防火墙设置不当导致ssh无法连接
今天学网络编程的时候,看见有陌生ip连接,所以打开了防火墙禁止除本机之外的其他ip连接: 但是当我再次用ssh的时候,连不上了才发现大事不妙。 折腾了半天,发现阿里云上可以在线向服务器发送命令,所以赶紧把2…...

使用WebAssembly优化Web应用性能
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用WebAssembly优化Web应用性能 引言 WebAssembly 简介 安装工具 创建 WebAssembly 项目 编写 WebAssembly 代码 编译 WebAssem…...

软件测试模型
软件测试模型是在软件开发过程中,用于指导软件测试活动的一系列方法和框架。这些模型帮助测试团队确定何时进行测试、测试什么以及如何测试,从而确保软件的质量和稳定性。 一 V模型 V模型是一种经典的软件测试模型,它由瀑布研发模型演变而来的测试模型…...

动态规划——两个数组的dp问题
目录 一、最长公共子序列 二、不同的子序列 三、通配符匹配 四、正则表达式匹配 五、两个字符串的最小ASCII删除和 六、最长重复子数组 七、交错字符串 一、最长公共子序列 最长公共子序列 第一步:确定状态表示 dp[i][j]:表示字符串 s1 的 [0&am…...

视频QoE测量学习笔记(二)
目录 自适应比特率(ABH或ABS) HAS:HTTP adaptive streaming 自适应本质: HAS正在解决传统流协议中主要关注的几个方面: DASH标准化原因 HAS发展 编码: 影响HAS系统的四个主要问题: 一个健全的HAS方…...

RSA算法详解:原理与应用
RSA算法详解:原理与应用 RSA算法是现代密码学的基石之一,广泛应用于安全通信、数据加密和身份验证等领域。本文将详细介绍RSA算法的原理、实现步骤以及实际应用。 一、RSA算法概述 RSA(Rivest-Shamir-Adleman)算法由Ron Rivest…...

YOLOv6-4.0部分代码阅读笔记-effidehead_fuseab.py
effidehead_fuseab.py yolov6\models\heads\effidehead_fuseab.py 目录 effidehead_fuseab.py 1.所需的库和模块 2.class Detect(nn.Module): 3.def build_effidehead_layer(channels_list, num_anchors, num_classes, reg_max16, num_layers3): 1.所需的库和模块 impo…...

特朗普概念股DJT股票分析:为美国大选“黑天鹅事件”做好准备
猛兽财经核心观点: (1)特朗普媒体科技集团的股价近期已经从年初至今的高点下跌了35%以上。 (2)该公司将面临一个重大的黑天鹅事件。 (3)这一结果将对特朗普媒体科技集团产生重大影响。 随着投资…...

【MySQL】 运维篇—故障排除与性能调优:常见故障的排查与解决
数据库系统在运行过程中可能会遇到各种故障,如性能下降、连接失败、数据损坏等。及时有效地排查和解决这些故障,对于保证系统的稳定性和数据的完整性至关重要。 常见故障及排查方法 1. 数据库连接失败 故障描述:应用程序无法连接到数据库&…...

Android R S T U版本如何在下拉栏菜单增加基本截图功能
本文主要是MTK增加下拉栏开关菜单,功能实现为基本的截图功能,metrics_constants.proto修改 QuickSetting 新增快捷设置图标,以便对应getMetricsCategory获取;一个布局文件,一个配置加载合入实现,一个新增想要实现截图的类。 /frameworks/base/proto/src/metrics_constan…...

C#二叉树原理及二叉搜索树代码实现
一、概念 二叉树(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的每个节点包含三个部分:一个值、一个指向左子节点的引用和一个指向右子节点的引用。 二、二叉树…...

.eslintrc.js 的解释
如果您的项目中没有 .eslintrc.js 文件,您可以按以下步骤创建并配置 ESLint: 1. 创建 ESLint 配置文件 在您的项目根目录下创建一个新的文件,命名为 .eslintrc.js。 2. 配置 ESLint 规则 在 .eslintrc.js 文件中添加以下内容,…...

确保企业架构与业务的一致性与合规性:数字化转型中的关键要素与战略实施
在现代企业的数字化转型过程中,确保企业架构(Enterprise Architecture, EA)与企业业务的紧密一致性与合规性至关重要。无论是在战略层面还是运营层面,EA都为企业的未来发展提供了清晰的蓝图,确保企业在应对复杂的业务环…...

goframe开发一个企业网站 前端界面 拆分界面7
将页面拆出几个公用部分 在resource/template/front创建meta.html header.html footer.html meta.html <head><meta charset"utf-8"><meta content"widthdevice-width, initial-scale1.0" name"viewport"><title>{{.…...