10 状态码

Posted by CodingWithAlice on April 24, 2021

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 服务器当前很忙,暂时无法响应服务