专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
OSC开源社区  ·  Bun ... ·  18 小时前  
程序员的那些事  ·  OpenAI ... ·  昨天  
OSC开源社区  ·  升级到Svelte ... ·  4 天前  
程序猿  ·  “我真的受够了Ubuntu!” ·  3 天前  
程序猿  ·  “未来 3 年内,Python 在 AI ... ·  4 天前  
51好读  ›  专栏  ›  SegmentFault思否

http 状态码竟然可以这样记

SegmentFault思否  · 公众号  · 程序员  · 2019-02-27 08:00

正文

标题皮了一下,但是内容应该算是比较用心的,不是直接抄了一下官方文档和一堆抽象的术语,尽量配合实例解释的通俗一些。

基本介绍

状态码(Status Code)和原因短语(Reason Phrase)用于 简单描述请求的结果 。常见的比如:

  • 200 OK,表示请求成功。

  • 404 Not Found表示请求的资源未找到。

原因短语(上面的ok 和Not Found)是对状态码的解释说明。

形如 200 这样的状态码,这里的 3 位数字 中第1位数字, 通常 表示响应的类别( 会有一两个例外 ),大致可以分成以下几类(完整的状态码表,参见http1.1-RFC6):

状态码 含义
1xx 请求正被处理
2xx 请求成功处理
3xx 请求需要附加操作,常见的例子如重定向
4xx 客户端出错导致请求无法被处理
5xx 服务端处理出错

4、5常被用在排查bug时前后端互相甩锅-_-!下面详细介绍常用的状态码和原因短语。

分类

2xx

200 OK

表示请求已经被正常处理,这个比较常见,就不多说了。

204 NO Content

表示请求成功,但是响应的报文中不含实体主体。通常用于只需要客户端向服务端发送信息,而不需要接受新信息的情况使用。

这么官方且抽象的描述显然不是我的风格,举例:现在很常见的一种请求类型 option ,通常被用来做正式请求的预请求,这个请求 只需要确认后续的请求能不能通过,即只需要一个结果,而不需要返回其他内容 ,这类请求成功时就会返回204。

相信大家小时候都经常考试,如果拿试题来打个比方,那么:

  • 其他状态码可以比喻为填空题:客户端提问(发请求),服务端 给出详细答案 (返回实体内容)。

  • 204可以理解为判断题:客户端提问(发请求),服务端 给出判断,对或者错 (只要响应头有状态码,不需要实体内容)。

206 Partial Content

字面意思:只返回了请求资源的 部分 。这种情况必须提到提到一个请求头 Range ——在 http 的请求中,这个头部用来表示 范围请求 ,例如:

  1. 'Range':byte=5001-10000 // 表示本次要请求资源的5001-10000字节的部分

这种情况下,如果服务器接受范围请求并且成功处理,就会返回 206 ,并且在响应的头部返回:

  1. 'Content-Range':bytes 5001-10000/10000 // 表示整个资源有10000字节,本次返回的范围为 5001-10000字节

3xx

301 Moved Permanently

字面意思:资源被 永久 重定向了。这种情况下 响应 的头部字段 Location 中一般还会返回一个地址,用来表示要新地址。例如客户端发起一个请求,要访问a站点,此时收到的响应如下:

  1. 301 Moved Permanently

  2. ...

  3. Location:`b.com`

  4. ...


  5. //上述内容表示:亲,您请求的资源已经永久转移啦,这边建议您去新的地址b.com访问呢,以后也请直接访问新地址哦

302 Found

字面意思:资源 临时 重定向了。和301的唯一区别就在于一个是临时,一个是永久:还是举上面的例子,响应如下:

  1. 302 Found

  2. ...

  3. Location:`b.com`

  4. ...

  5. //上述内容表示:亲,您请求的资源被临时转移啦,后面也有可能再次转移,所以这边建议您本次去新的地址b.com访问,以后的话还是先访问原来地址哦,有任何变化mm依然会热心为你解答

303 See Other

这个和302很像,但是有个细微区别是,除了会提示客户端去请求 Location 以外,还会要求请求要使用 Location 时使用 GET 方法。 在这补充一下一个历史背景:请求返回301 302 303 时,几乎所有浏览器都会把原先的POST请求改为GET请求。虽然FRC1945和RFC2068规范中有规定:不允许客户端在重定向时修改方法。

简单的说,实际的浏览器在处理301和302时,默认就会把原先的POST请求改为GET请求,所以实际上使用303的意义,单纯只是让语义化更清晰点(303表示服务器 明确告诉 客户端,你要使用 GET 方法访问 location ;如果是302,就是仅仅告诉客户端要访问 location ,不限制方法,但是实际上客户端自己也会用 GET 方法访问)。

304 Not Modified

字面意思是:资源未改变,可直接使用缓存。

这种响应一般是 GET 请求中带有 附加条件 ,例如请求头中含有 if - Match , if - Modified - Since 等( if - Match 表示只请求带有特殊标记的资源, if - Modified - Since 表示请求指定时间后未变更的资源,因为本文主要讲解状态码,所以不在此引入太多http头部的相关内容,这里是为了简单解释下 附加条件请求 的含义)。

这种情况下,服务端不会返回响应主体,含义就是:”从你上次访问以来这个资源都没变过哟,直接使用你本地的缓存就行啦“。

304就是3xx里面的一个特例,因为它不算是一个重定向(一般我们认为重定向要给出一个新的地址让客户端去访问,304如果一定要解释为重定向,只能解释为让客户端转去访问缓存-_-)。

307 Temporary Redirect

这个重定向是为了解决前面刚刚介绍的一个历史背景问题: 302







请到「今天看啥」查看全文