10 状态码
目前 RFC
标准里规定的状态码是三位数,并把状态码分成了五类,用数字的第一位表示分类,实际范围在 100 - 599,允许自行扩展
1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作
-
101 Switching Protocols
场景:如果客户端使用
Upgrade
头字段,要求在HTTP
协议的基础上改成其他的协议继续通信,比如WebSocket
,而如果服务器也同意变更协议,就会发送状态码101
2××:成功,报文已经收到并被正确处理
- 200 OK 表示一切正常,服务器如客户端所期望的那样返回了处理结果,如果是非
HEAD
请求,通常在响应头后都会有 body 数据 - 204 No Content 响应头后 没有 body 数据
- 206 Partial Content 在客户端发送【范围请求】、要求获取资源的部分数据时,表示服务器成功处理请求,但 body 里的数据 不是资源的全部,而是其中的一部分
3××:重定向,资源位置发生变动,需要客户端重新发送请求
- 301 Moved Permanently 永久重定向 - 此次请求的资源已经不存在了,需要改用改用新的
URI
再次访问,在location
字段中有新地址 - 302 Found/Moved Temporarily 临时重定向 - 请求的资源还在,但需要暂时用另一个
URI
来访问,在location
字段中有新地址 - 304 Not Modified 缓存重定向 - 用于
If-Modified-Since
等条件请求,表示 资源未修改,可以继续使用,用于缓存控制
【注意区分301、302】
相似点:301 和 302 都会在响应头里使用字段 Location
指明后续要跳转的 URI
,最终的效果很相似,浏览器都会重定向到新的 URI
不同点:一个是临时,一个是永久,场景举例:
- 场景1:网站从
HTTP
升级到了HTTPS
,原来的HTTP
不用了,是永久的,要配置301跳转,把所有HTTP
流量都切换到HTTPS
,之后浏览器就会有缓存 - 场景2:某天后台系统维护服务暂时不可用,这就属于临时的,配置成 302 跳转,把流量临时切换到一个静态通知页面,浏览器 看到这个 302 就知道这只是暂时的情况,不会做缓存优化,第二天还会访问原来的地址
4××:客户端错误,请求报文有误,服务器无法处理
- 400 Bad Request 表示请求 报文有错误,这是笼统的错误码 - 应该避免使用
- 403 Forbidden 表示 服务器禁止访问资源,例如信息敏感、法律禁止等
- 404 Not Found 资源在本服务器上未找到,所以无法提供给客户端
还有一写明确说明了错误原因的状态码,开发中常用 如下
- 405 Method Not Allowed:不允许使用某些方法操作资源,例如不允许 POST 只能 GET;
- 406 Not Acceptable:资源无法满足 客户端请求的条件,例如请求中文但只有英文;
- 408 Request Timeout:请求超时,服务器等待了过长的时间;
- 409 Conflict:多个请求发生了冲突,可以理解为多线程并发时的竞态;
- 413 Request Entity Too Large:请求报文里的 body 太大;
- 414 Request-URI Too Long:请求行里的 URI 太大;
- 429 Too Many Requests:客户端发送了太多的请求,通常是由于服务器的限连策略;
- 431 Request Header Fields Too Large:请求头某个字段或总体太大;
5××:服务器错误,服务器在处理请求时内部发生了错误
- 500 Internal Server Error 通用的错误码,可以使用,不抛出错误原因,有利于安全
- 502 Bad Gateway 服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误
- 503 Service Unavailable 服务器当前很忙,暂时无法响应服务