从 字节面试题 看HTTP状态码

271 阅读8分钟

前言

本文只是功利性的从几道题目出发,把一些容易混淆的一些点讲一讲,并将容易出现在面试题中的一些问题单独拎出来说说,真正想要搞懂这块,还是应该系统的进行学习

首先 让我们看几道面试题

  1. 请说说常见的几种状态码,分别属于哪里的问题
  2. 304代表了什么=>延伸到http缓存
  3. 401和403之间的区别
  4. 410和404之间的区别
  5. 502和504之间的区别
  6. 有遇到过307么,和302,301的区别是什么

START

1. 常见的状态码类型

我们常见的基本是以下几种,具体每个可以百度或者看看其他帖子

  1. 1xx 一般是中间状态
  2. 2xx 一般是成功的状态码
  3. 3xx 一般代表重定向
  4. 4xx 一般代表客户端问题
  5. 5xx 一般代表服务器问题

2. 304代表了什么

我们在浏览器缓存中会知道,有200和304两种读取缓存的状态码,200是强缓存生效的时候,304是协商缓存生效的时候的状态码

3. 401,403的区别

我们知道 4xx系列一般是客户端的问题,也经常会遇到401和403两个状态码,两者都是表达了一个不可访问的状态,但是实际语义上却有着根本的差距. 我们先来看看mdn上对两者的解释

401 Unauthorized

状态码 401 Unauthorized 代表客户端错误,指的是由于缺乏目标资源要求的身份验证凭证,发送的请求未得到满足。

这个状态码会与   WWW-Authenticate 首部一起发送,其中包含有如何进行验证的信息。

403 Forbidden

状态码 403 Forbidden 代表客户端错误,指的是服务器端有能力处理该请求,但是拒绝授权访问。

这个状态类似于 401,但进入该状态后不能再继续进行验证。该访问是长期禁止的,并且与应用逻辑密切相关(例如不正确的密码)。

两者最根本的区别在于是否包含用户的身份凭证信息,我们举个实际的例子

小明是刚加入公司的一个运营实习生,上级给他安排了一个统计网站后台数据的任务和数据的地址,小明兴致满满的打开后台,想要去查阅数据,结果发现只能跳转到登录页面.这个时候遇到的是什么?

这个时候遇到的便是 401,代表了用户没有身份凭证,服务器不知道你是谁,于是给你401让你跑去登录

小明千辛万苦申请到了账号,再次点击链接,结果发现跳转到了404页面,这时候看起来是404,但是他实际遇到了什么问题?

这个时候遇到的便是403,代表了用户虽然有身份凭证,但是你不具有访问这个资源的权限,对外而言我只好告诉你访问的东西地址不对,等你有了权限,我就会给你真正的内容

4. 410和404之间的区别

404我们耳熟能详,一句404 Not Found无论你是不是个技术人基本都听过和遇到过,表示了资源不存在,虽然是服务器端无法找到所请求的资源,但是也是一个客户端错误,这里将它认为是因为错误的链接导致的请求错误而不是服务器内容的问题.

但是404有一个问题,他不知道这个请求的资源是暂时性没有还是永远也不会再有,是资源丢了还是压根不存在于是便有了410

410表示请求的目标资源在原服务器上不存在了,并且是永久性的丢失,这里有一点要说明下,410的资源,会被浏览器默认缓存,

一般来说,410更强调一个人为的永久性丢失,表面这个资源曾经存在过,但是现在他已经不可用了,不要再来骚扰我啦. 而404则是一个对数据不可用原因模棱两可的一种返回,可能是服务器暂时抽风,也可能是真的不存在,总之我也不告诉你原因,你自己琢磨.

5. 502和504之间的区别

5xx系列都是服务端的问题,这里的服务端包含了服务器和网关两者

  1. 502 Bad Gateway
  2. 503 Service Unavailable
  3. 504 Gateway Timeout

上面这三个,根据名字我们也能大概知道个原因,在这其中502,504都带了Gateway这个名字

502通常来说是作为网关或者代理工作的服务器尝试执行请求时,接受到了服务器无效的响应

504是网关或者代理在接受服务器响应时,超出了最大允许的时间范围

503代表了服务器暂时不可用,最好是携带不可用原因,譬如维护中,也需要给出维护时间

nginx为例,缓存池不足的时候,上游返回时间过长导致超时,返回的便是504,而当链接错误的时候,或者服务器无响应的时候,返回的便是502,

...未完待续TODO

6.有遇到过307么,和302,301的区别是什么

我们先来做个操作,在浏览器打开开发者工具,地址栏输入www.baidu.com

image.png

这是一个从http跳转到https的页面,我们可以看到这边使用到了307,诶你看你要问了,不是一般就是301,302么,怎么还有个307

我们先看看我们都懂的301,302.

301 Moved Permanently

HTTP 301 永久重定向 说明请求的资源已经被移动到了由Location 头部指定的url上,是固定的不会再改变。搜索引擎会根据该响应修正。

尽管标准要求浏览器在收到该响应并进行重定向时不应该修改http method和body,但是有一些浏览器可能会有问题。所以最好是在应对GET 方法时使用301,其他情况使用308来替代301。

302 Found

HTTP 302 Found 重定向状态码表明请求的资源被暂时的移动到了由该HTTP响应的响应头Location指定的 URL 上。浏览器会重定向到这个URL, 但是搜索引擎不会对该资源的链接进行更新 (In SEO-speak, it is said that the link-juice is not sent to the new URL)。

即使规范要求浏览器在重定向时保证请求方法和请求主体不变,但并不是所有的用户代理都会遵循这一点,你依然可以看到有缺陷的软件的存在。所以推荐仅在响应 GET,POST方法时采用 302 状态码,而在其他时候使用 307Temporary Redirect 来替代,因为在这些场景下方法变换是明确禁止的。

在确实需要将重定向请求的方法转换为 GET的场景下,可以使用 303 See Other。例如在使用 PUT 方法进行文件上传操作时,需要返回确认信息(例如“你已经成功上传了xyz”)而不是上传的资源本身,就可以使用这个状态码。

总结上面

一般来说,301代表这个资源永久的更新地址了,比如服务器域名更新的时候,可能就会设置旧资源更新到新的域名地址,302代表可能暂时维护一个新地址,可能过段时间还会换回来,有一个临时的状态表示.

因为http请求的多样性,我们不能肯定所有请求都是GET获取资源,可能用到PUT等语义化的请求,而301会使用GET去获取资源,302只会使用POSTGET去跳转,所以就有了307,308两个支持使用原有方式进行重定向的方式.

实际上,看了多个页面,谷歌,百度,juejin等,大多是看到的307,思考一个问题,为什么这里不能使用301呢?

ps:关于前辈很烦人的事真的好甜啊