标题皮了一下,但是内容应该算是比较用心的,不是直接抄了一下官方文档和一堆抽象的术语,尽量配合实例解释的通俗一些。
基本介绍
状态码(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。
相信大家小时候都经常考试,如果拿试题来打个比方,那么:
206 Partial Content
字面意思:只返回了请求资源的
部分
。这种情况必须提到提到一个请求头
Range
——在
http
的请求中,这个头部用来表示
范围请求
,例如:
'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
字面意思:资源
临时
重定向了。和301的唯一区别就在于一个是临时,一个是永久:还是举上面的例子,响应如下:
302 Found
...
Location:`b.com`
...
//上述内容表示:亲,您请求的资源被临时转移啦,后面也有可能再次转移,所以这边建议您本次去新的地址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