常见的HTTP状态码梳理

包括几种状态码之间的联系

Posted by Haiming on April 11, 2020

话不多说。

参考https://juejin.im/post/5c2320266fb9a04a006f0e20

1. 1xx 信息性状态码

100: 服务器接受到请求,但是还没做出响应

举例:在淘宝上面买了东西,订单生成成功,但是还没发货。

2. 2xx 成功

200: 成功。正常处理

204: No Content: 成功,但是没有要返回的内容。像发送了空包裹。

206: Partial Content: 只要其中一部分。可以用来做断点续传。

此处插一下具体过程:首先客户端会发送的header里面会带上对应的ETag,这个ETag可以标明文件的版本,具体看这:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag。 ETag一般都是用If-Range 这个字段来传输的。如果If-Range这个字段满足条件,那么服务器就会读取Header之中的Range这个字段来获取当前客户端想要文件的哪部分。比如Range:bytes=5001-10000就是说我要5001到10000字节这段的东西。那么就会返回206。

但是如果不满足呢?比如我的文件版本实际上已经改变了,那么就会返回412,412的意思是你的要求我无法满足,那么这时候客户端就会再次请求,这次请求是全量的文件。412的具体过程下面会讲。

3. 3xx 重定向

301: 永久重定向:你要的资源我这没有,而且永久的定位到了B,你去B拿吧。

302: Found, 临时重定向:你要的资源暂时定位到了B,但是以后可能还会改变,这次你先去B这个临时地址请求吧。

303:See Other,也是临时重定向。有点懵逼是吧?这个和302的区别在于,在访问303返回的新的资源地址的时候,必须使用get方法去获取。

304: Not Modified,资源未改变。“你请求的东西和上次没改变,你去自己的缓存里面再拿一遍吧。我就不给你了”

4. 4xx 客户端错误

400: Bad Request。 这个是前端给的东西不对,比如没有按照对应的字段给,或者没有转换成标准Json,导致服务端“不理解”这个请求。

401:未验证:未登录。

403: Forbidden: 我知道你来访问这个,但是我不给你。为啥不给?你看我附带的message吧。

404: Not Found

405: Method Not Allowed: 用错方法了

412: Precondition Failed: 前提失败。上面我们讲206的时候是不是讲到了?说白了,就是你要的这个条件我这返回不了,比如ETag已经改了,没法给你上次的文件了。客户端看到412之后往往会取消条件再次访问,比如本来是断点续传,现在就请求全量包。

5. 5xx 服务端错误

500:Server error。啥意思?程序出bug了。再次引用我组tech lead的一句话;”谁出500谁的锅“。

503:Service Unavailable: 无法提供服务。比如现在服务器爆满,没法提供服务了,就给一个503,一般而言还会给一个retry-after的这么一个头,告诉你多久之后再来吧。