http【详解】状态码,方法,接口设计 —— RestfuI API,头部 —— headers,缓存

http 状态码

  • 1xx 服务器收到请求

  • 2xx 请求成功

    • 200 成功
  • 3xx 重定向(目标服务器返回另一个服务器的地址,浏览器会自动去访问另一个服务器)

    • 常见应用场景:搜索引擎,短网址

    • 301 永久重定向 (常用于已停服的旧域名/旧网址)

      目标服务器返回301,并在返回信息的 headers 的 location 的值为新服务器地址,浏览器会转向请求新服务器,之后所有的请求都将不再访问原目标服务器,而是直接访问新服务器

    • 302 临时重定向(配合 location,浏览器自动处理 )

      目标服务器返回302,并在返回信息的 headers 的 location 的值为新服务器地址,浏览器会转向请求新服务器,但下次请求时,还是会访问原目标服务器

    • 304 资源未被修改

      当客户端缓存的资源(如css,js等)和服务器上的资源相同时,目标服务器会返回 304 ,并不再返回请求的资源。

  • 4xx 客户端错误

    • 403 没有权限
    • 404 资源未找到
  • 5xx 服务端错误

    • 500 服务器错误
    • 504 网关超时

http 方法

get 获取数据

post 新建数据

patch/put 更新数据

delete 删除数据

面试题:get 请求和 post 请求的区别- 功能不同:get 用于从服务器获取数据,post 用于向服务器传递数据
- 传参方式不同:get 通过拼接url传递参数,会暴露在地址栏中,post 通过请求体(request body)传输参数,对用户不可见,相对于get 更安全。
- 传参数据大小限制不同:根据浏览器的不同,get 传输数据大小不能超过2k-4k,post 无限制,可传输大数据。
- 请求方式不同:get请求:1)浏览器请求tcp连接(第一次握手)2)服务器答应进行tcp连接(第二次握手)3)浏览器确认,并发送get请求头和数据(第三次握手)4)服务器返回200 OK响应psot请求:1)浏览器请求tcp连接(第一次握手)2)服务器答应进行tcp连接(第二次握手)3)浏览器确认并发送psot请求头(第三次握手)4)服务器返回100 Continue响应5)浏览器发送数据6)服务器返回200 OK响应

http 接口设计 —— RestfuI API

  • 传统 API设计: 把每个 url 当做一个功能
  • Restfu API设计: 把每个 url 当做一个唯一的资源

特点一:不使用 url 参数

传统 API设计 —— 随 url 参数的不同,执行不同的功能

/api/list?pageIndex=2

Restfu API设计 —— 每个 url 对应唯一的资源

/api/list/2

特点二:用 method 表示操作类型

传统 API设计 —— 根据请求方法无法判断出具体功能

// 创建数据  ————  post 请求
/api/create-blog// 修改数据  ————  post 请求
/api/update-blog?id=100// 查询数据  ————  get 请求
/api/get-blog?id=100

Restfu API设计 —— 每种请求方法对应固定的数据操作

// 创建数据  ———— post 请求
/api/blog// 修改数据  ————  patch 请求 
/api/blog/100// 查询数据  ————  get 请求
/api/blog/100

http 头部 —— headers

请求头 Request Headers

  • Accept 浏览器可接收的数据格式
  • Accept-Encoding 浏览器可接收的压缩算法,如 gzip,为减小流量消耗,服务端可能对数据进行了压缩再返回给客户端,客户端再解压使用。
  • Accept-Languange 浏览器可接收的语言,如 zh-CN
  • Connection: keep-alive 一次 TCP 连接重复使用(不用断开后再重新连接,提升了效率)
  • cookie 浏览器为识别用户身份缓存的信息,同域请求时,浏览器都会自动带上
  • Host 域名
  • 【重要】User-Agent (简称 UA)浏览器信息,可用于对用户进行分析,如用户中使用谷歌浏览器的占比等。
  • Content-type 发送数据的格式,如 application/json,在 get 请求中没有这个参数。
  • If-Modified-Since 上次服务器返回的 Last-Modified 值(资源的最后修改时间),具体用途详见下文的协商缓存方案一 Last-Modified
  • If-None-Match 上次服务器返回的 Etag 值(资源的唯一标识符),具体用途详见下文的协商缓存方案二 Etag

返回头 Response Headers

  • Content-type 返回数据的格式,如application/json
  • Content-length 返回数据的大小,多少字节
  • Content-Encoding 返回数据的压缩算法,如 gzip
  • Set-Cookie 【重要】服务端可通过此参数,修改客户端浏览器中的cookie 信息
  • Cache-Control 控制强制缓存的逻辑
    • 【重要】max-age 缓存过期时间
    • 【重要】no-cache 禁止浏览器缓存
    • no-store 既禁止浏览器缓存,也禁止服务端缓存
    • private 只允许最终的客户端进行缓存
    • public 允许中间代理做缓存
Cache-Control: max-age=31536000 // 单位是秒
  • Expires 【了解即可】与 Cache-Control 功能相同,已被其代替。
  • Last-Modified 资源的最后修改时间,具体用途详见下文的协商缓存方案一 Last-Modified
  • Etag 能唯一标识资源的字符串 ,具体用途详见下文的协商缓存方案二 Etag

自定义 Headers

使用场景:限定客户端必须带有指定的 Headers 信息才能访问服务器,否则视为非法访问

// axios 中自定义 Headers 的方法
headers:{'自定义的请求头key':'自定义的请求头的值'}

缓存相关的 headers

http 缓存

客户端浏览器将从目标服务器请求到的数据,在浏览器的本地中存储一份,以便下次请求时,不再重新请求相关数据。

http 缓存的意义(为什么要有http 缓存)

可以减少http请求的数量和体积,从而提升性能(让页面渲染更快,缓解了服务器压力,减少了不必要的数据传输【节省了带宽】)

哪些资源可以被缓存?

静态资源( js,css,img )

强制缓存

在这里插入图片描述

  • 第一次请求时,服务器会返回相应的资源,若返回头中带有 Cache-Control 则该资源会被浏览器缓存
  • 后续请求时,会先判断访问时间是否超过了 Cache-Control 限定的有效期,若没有超过有效期,则会使用本地缓存中的数据,不会访问服务器。

在这里插入图片描述

  • 若超过有效期,则会再次访问服务器获取资源
    在这里插入图片描述

协商缓存

  • 是服务器端的一种缓存策略
  • 由服务器判断客户端资源是否和服务端资源一样
  • 一样则返回 304,不一样则返回 200 和最新的资源
    在这里插入图片描述

方案一 Last-Modified 资源的最后修改时间

在这里插入图片描述

  • 第一次请求时,服务器返回资源和 Last-Modified
  • 后续请求,在请求头中会带上 If-Modified-Since (值为上次服务器返回的 Last-Modified 值)
  • 服务器将对比请求头中的 If-Modified-Since 值和服务器上资源的最后修改时间
  • 若客户端传来的资源最后修改时间与服务器上资源的最后修改时间相同,则说明资源没有发生变化,服务器返回 304
  • 若客户端传来的资源最后修改时间与服务器上资源的最后修改时间不同,则说明资源有更新,服务器返回新的资源和新的 Last-Modified

方案二 Etag 资源的唯一标识符

原理与Last-Modified相同,只是Last-Modified的值是时间,Etag是一个能唯一标识资源的字符串
在这里插入图片描述

  • 第一次请求时,服务器返回资源和 Etag
  • 后续请求,在请求头中会带上 If-None-Match (值为上次服务器返回的 Etag 值)
  • 服务器将对比请求头中的 If-None-Match 值和服务器上资源的 Etag 值
  • 若客户端传来的资源唯一标识符与服务器上资源的唯一标识符相同,则说明资源没有发生变化,服务器返回 304
  • 若客户端传来的资源唯一标识符与服务器上资源的唯一标识符不同,则说明资源有更新,服务器返回新的资源和新的 Etag

两种方案可以同时使用

同时使用 Last-Modified 和 Etag 时,会优先使用 Etag ,因为 Last-Modified 只能精准到秒,且如果资源被重复生成,内容不变时,Etag 更精确。(资源重复生成,但内容不变时,Etag 也不会变)

在这里插入图片描述
(学习要求:上图需能无任何提示自行绘制出来!)

刷新操作对缓存的影响

页面跳转刷新 – 强制缓存有效,协商缓存有效

如地址栏输入 ur,跳转链接,前进后退等

手动刷新 – 强制缓存失效,协商缓存有效

windows 快捷键 F5,点击刷新按钮,右击菜单刷新

强制刷新 – 强制缓存失效,协商缓存失效

windows 快捷键 ctrl +F5

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络协议栈--应用层--HTTPS协议

目录 一、HTTPS协议原理1.1 HTTPS协议是什么?1.2 概念准备1.2.1 什么是“加密”?1.2.2 为什么要加密?1.2.3 常见的加密方式1.2.3.1 对称加密1.2.3.2 非对称加密 1.2.4 数据摘要&&数据指纹1.2.5 数字签名1.2.6 理解链-承上启下 1.3 HT…

软考59-上午题-【数据库】-小结+杂题

一、杂题 真题1: 真题2: 真题3: 真题4: 真题5: 真题6: 真题7: 真题8: 二、数据库总结 考试题型: 1、选择题(6题,6分) 2、综合分析题…

AutoGPT实现原理

AutoGPT是一种利用GPT-4模型的自动化任务处理系统,其主要特点包括任务分配、多模型协作、互联网访问和文件读写能力以及上下文联动记忆性。其核心思想是通过零样本学习(Zero Shot Learning)让GPT-4理解人类设定的角色和目标,并通过…

Golang Channel 详细原理和使用技巧

1.简介 Channel(一般简写为 chan) 管道提供了一种机制:它在两个并发执行的协程之间进行同步,并通过传递与该管道元素类型相符的值来进行通信,它是Golang在语言层面提供的goroutine间的通信方式.通过Channel在不同的 goroutine中交换数据,在goroutine之间…

Vue.js学习笔记(四)抽奖组件封装——九宫格抽奖

基于VUE2九宫格组件的开发 文章目录 基于VUE2九宫格组件的开发前言一、开发步骤1.数据准备2.页面布局3.事件方法 二、最终效果总结 前言 由于业务需求,需要手动开发九宫格抽奖组件,特此记录学习宫格组件开发。 一、开发步骤 1.数据准备 data 代码如下&…

抽象步骤条(2.0版本)

vue3 router ele-plus 猜猜看为什么使用组件库&#xff01; 他呀的&#xff01;查看密码要自己写&#xff0c;验证信息也要自己写&#xff0c;所以说会用组件库会轻松一点&#xff0c;&#xff0c;&#xff0c; 代码如下 <template><div class"main"&g…

智能驾驶规划控制理论学习06-基于优化的规划方法之数值优化基础

目录 一、优化概念 1、一般优化问题 2、全局最优和局部最优 二、无约束优化 1、无约束优化概述 2、梯度方法 通用框架 线性搜索 回溯搜索 3、梯度下降 基本思想 实现流程 ​4、牛顿法 基本思想 实现流程 5、高斯牛顿法 6、LM法&#xff08;Le…

构建可视化工具选择策略

更多的信息总是意味着更好的结果吗&#xff1f;这完全取决于项目所处的环境。 以烘焙为例。当你做蛋糕时&#xff0c;你的原材料经历了许多化学变化和烹制过程。如果任何一个环节出现问题&#xff0c;蛋糕就做不好。但这并不意味着你需要理解食材在分子级别上发生了什么&#…

YOLO系列中的“data.yaml”详解!

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、data.yaml介绍 YOLO系列中的data.yaml文件包含了YOLO系列模型运行所需要的数据集路径、数据集中的类别数及标签。数据集路径可以用绝对路径也可以…

RISC-V特权架构 - 中断与异常概述

RISC-V特权架构 - 中断与异常概述 1 中断概述2 异常概述3 广义上的异常3.1 同步异常3.2 异步异常3.3 常见同步异常和异步异常 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 中断概述 中断&#xff08;Interrupt&#xff09;机制&#xff0c;即…

mapbox加载全球3D建筑

本案例使用Mapbox GL JavaScript库进行加载全球3D建筑。 文章目录 1. 引入 CDN 链接2. 创建地图3. 监听地图加载完成事件3.1. 获取地图的样式中的图层3.2. 查找图层3.3. 添加三维建筑图层 4. 演示效果5. 代码实现 1. 引入 CDN 链接 <!-- 1.引入CDN链接 --> <script sr…

bert 相似度任务训练简单版本,faiss 寻找相似 topk

目录 任务 代码 train.py predit.py faiss 最相似的 topk 数 任务 使用 bert-base-chinese 训练相似度任务&#xff0c;参考&#xff1a;微调BERT模型实现相似性判断 - 知乎 参考他上面代码&#xff0c;他使用的是 BertForNextSentencePrediction 模型&#xff0c;Bert…