10 响应状态码

状态行

状态行由三部分组成:Version + Status Code + Reason

  1. Version 部分是 HTTP 协议的版本号,通常是 HTTP/1.1,用处不是很大
  2. Reason 部分是原因短语,是状态码的简短文字描述,例如“OK”“Not Found”等等,也可以自定义。
    但它只是为了兼容早期的文本客户端而存在,提供的信息很有限,目前的大多数客户端都会忽略它。
  3. 状态码一个十进制数字,以代码的形式表示服务器对请求的处理结果。范围是 000-999。

状态码的分类

  • 1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作;
  • 2××:成功,报文已经收到并被正确处理;
  • 3××:重定向,资源位置发生变动,需要客户端重新发送请求;
  • 4××:客户端错误,请求报文有误,服务器无法处理;
  • 5××:服务器错误,服务器在处理请求时内部发生了错误。

常用的状态码

1xx

  1. 表示提示信息
  2. 101 Switching Protocols:转换协议
    • 客户端使用 Upgrade 头字段,要求在 HTTP 协议的基础上改成其他的协议继续通信,比如 WebSocket。
    • 如果服务器也同意变更协议,就会发送状态码 101,但这之后的数据传输就不会再使用 HTTP 了。

2xx

  1. 表示服务器收到并成功处理了客户端的请求,这也是客户端最愿意看到的状态码。
  2. 200 OK
    • 表示一切正常,服务器如客户端所期望的那样返回了处理结果
    • 如果是非 HEAD 请求,通常在响应头后都会有 body 数据。
  3. 204 No Content
    • 含义与“200 OK”基本相同,但响应头后没有 body 数据。
  4. 206 Partial Content:“部分所含之物”
    • HTTP 分块下载或断点续传的基础,在客户端发送“范围请求”、要求获取资源的部分数据时出现
    • 与 200 一样,也是服务器成功处理了请求,但 body 里的数据不是资源的全部,而是其中的一部分
    • 伴随着头字段“Content-Range”,表示响应报文里 body 数据的具体范围,供客户端确认

      例如“Content-Range: bytes 0-99/2000”,意思是此次获取的是总计 2000 个字节的前 100 个字节

3xx

  1. 表示客户端请求的资源发生了变动,客户端必须用新的 URI 重新发送请求获取资源,也就是通常所说的“重定向”。
  2. 301 Moved Permanently
    • “永久重定向”,含义是此次请求的资源已经不存在了,需要改用**新的 URI **再次访问。
  3. 302 Found
    • 俗称“临时重定向”,意思是请求的资源还在,但需要暂时用**另一个 URI **来访问
    • 301 和 302 都会在响应头里使用字段 Location 指明后续要跳转的 URI,最终的效果很相似,浏览器都会重定向到新的 URI。
  4. 304 Not Modified :未调整
    • 用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制。
    • 不具有通常的跳转含义,但可以理解成“重定向已到缓存的文件”(即“缓存重定向”)。

4xx

  1. 客户端发送报文有误
  2. 400 Bad Request
    • 报文错误,比较笼统
  3. 403 Forbidden
    • 服务器禁止访问资源
  4. 404 Not Found
    • 服务器未找到,无法提供给客户端,较笼统
  5. 其他
    • 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:请求头某个字段或总体太大;

5xx

  1. 表示客户端请求报文正确,但服务器在处理时内部发生了错误,无法返回应有的响应数据,是服务器端的“错误码”
  2. 500 Internal Server Error
    • 和 400 类似,但是对服务器友好。
  3. 501 Not Implemented
    • 客户端请求的功能不支持
  4. 502 Bad Gateway
    • 通常是服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误,但具体的错误原因也是不知道的。
  5. 503 Service Unavailable
    • 表示服务器当前很忙,暂时无法响应服务
    • 临时的
    • 503 响应报文里通常还会有一个“Retry-After”字段,指示客户端可以在多久以后再次尝试发送请求。

疑问

  1. 你在开发 HTTP 客户端,收到了一个非标准的状态码,比如 4××、5××,应当如何应对呢?

    • 目前客户端基本都是解析成失败的情况,大部分给个失败错误友好界面。
  2. 你在开发 HTTP 服务器,处理请求时发现报文里缺了一个必需的 query 参数,应该如何告知客户端错误原因呢?

    • 在返回body里面写明错误原因,状态码一般给500。
原文地址:https://www.cnblogs.com/hqq2019-10/p/14747733.html