http状态码竟然可以这样记

栏目: 后端 · 前端 · 发布时间: 6年前

内容简介:标题皮了一下,但是内容应该算是比较用心的,不是直接抄了一下官方文档和一堆抽象的术语,尽量配合实例解释的通俗一些。状态码(Status Code)和原因短语(Reason Phrase)用于简单描述形如

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

基本介绍

状态码(Status Code)和原因短语(Reason Phrase)用于简单描述 请求的结果 。常见的比如 200 OK,表示请求成功;404 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

根据字面意思可以知道,这个表示返回了部分的实体。

http的请求头中,有一个叫做 Range ,用来做范围请求,例如:

Range:byte=5001-10000 //表示请求资源的5001-10000字节的部分

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

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

3xx

301 Moved Permanently

字面意思:资源被永久重定向了。这种情况下响应的头部字段 Location 中一般还会返回一个地址,例如:

客户端发起一个请求,要访问a站点,此时收到的响应如下:

301 Moved Permanently 
...
Location:`b.com`
...

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

302 Found

字面意思:资源 临时 重定向了。这个情况和上面的唯一区别就在于一个是临时,一个是永久:还是上面的例子:

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

303 See Other

这个和302很像,但是有个细微区别是,除了会提示客户端去请求 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 时浏览器默认会转用 GET 方法去请求 Location ,而如果是 307 , 含义就是严格限制不允许从 POST 转为 GET ,这个目前我在实际工作中很少遇到。

4xx

4xx表示一般是客户端发生了错误。(这位前端同学,乖乖接了这个bug吧!)

400 Bad Request

(这个状态码相信大家一定很不陌生,特别是入门的新同学~)400的含义简单粗暴:“对不起,你的请求中有语法错误”,那具体是什么语法错误呢? 答案是-- 不一定,一般来说响应报文里会有一些提示,例如:

  • “哎呀,你多加了什么请求头,我不能接受呀”
  • “哎呀,你地址不是不是写错了,这个uri不存在啊”
  • “哎呀,你是不是请求方法错了,这个uri之只能用put而不是post”
  • 下面请各位随意补充
  • ...

401 Unauthorized

字面意思:未经过认证。一般在后台系统之类的应用里,用户登录之后会获得一个身份认证信息,然后生成 mac 之类的信息,放在请求头的 Authorization 字段里,发送给服务端,如果这个认证信息有问题或者根本没发送,就会出现这个状态码。

403 Forbidden

这个就简单了:禁止访问也就是无权限访问。至于具体为什么禁止,服务器可以在响应内容的实体部分给出,当然也可以不给(没错,我服务端就是这么了不起,为所欲为!)

404 Not Found

很常见了,字面含义,服务端没有找到所请求的资源,经验表明,一般这个错误是客户端的请求url写错了。(别问我怎么知道的)

5xx

5xx表明服务端发生了错误。(真是个令人开心的消息,老板,你看不是我的问题!)

500 Internal Server Error

简单粗暴,服务器故障了。啥?你问我什么故障?我哪知道,我只会熟练地把bug转给隔壁的服务端同学。

503 Service Unavailable

服务器暂时无法使用,可能是维护或者升级,反正无法使用。

小结

本文对常见的一些http状态码和原因做了总结,一方面希望能够给更多入门的同学提供帮助,一方面也做一个归纳总结,方便平时排查bug时速查,文中有一部分可能涉及到了 http头部 的知识,虽然也想尽可能剥离开来,但是为了解释说明没法也确实完全分割开-_-。

惯例:如果内容有错误的地方欢迎指出(觉得看着不理解不舒服想吐槽也完全没问题);如果有帮助,欢迎点赞和收藏,转载请征得同意后著明出处,如果有问题也欢迎私信交流,主页有邮箱地址


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learn Python 3 the Hard Way

Learn Python 3 the Hard Way

Zed A. Shaw / Addison / 2017-7-7 / USD 30.74

You Will Learn Python 3! Zed Shaw has perfected the world’s best system for learning Python 3. Follow it and you will succeed—just like the millions of beginners Zed has taught to date! You bring t......一起来看看 《Learn Python 3 the Hard Way》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具