状态行
状态行由三部分组成:Version + Status Code + Reason。
- Version 部分是 HTTP 协议的版本号,通常是 HTTP/1.1,用处不是很大
- Reason 部分是原因短语,是状态码的简短文字描述,例如“OK”“Not Found”等等,也可以自定义。
但它只是为了兼容早期的文本客户端而存在,提供的信息很有限,目前的大多数客户端都会忽略它。 - 状态码一个十进制数字,以代码的形式表示服务器对请求的处理结果。范围是 000-999。
状态码的分类
- 1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作;
- 2××:成功,报文已经收到并被正确处理;
- 3××:重定向,资源位置发生变动,需要客户端重新发送请求;
- 4××:客户端错误,请求报文有误,服务器无法处理;
- 5××:服务器错误,服务器在处理请求时内部发生了错误。
常用的状态码
1xx
- 表示提示信息
- 101 Switching Protocols:转换协议
- 客户端使用 Upgrade 头字段,要求在 HTTP 协议的基础上改成其他的协议继续通信,比如 WebSocket。
- 如果服务器也同意变更协议,就会发送状态码 101,但这之后的数据传输就不会再使用 HTTP 了。
2xx
- 表示服务器收到并成功处理了客户端的请求,这也是客户端最愿意看到的状态码。
- 200 OK
- 表示一切正常,服务器如客户端所期望的那样返回了处理结果
- 如果是非 HEAD 请求,通常在响应头后都会有 body 数据。
- 204 No Content
- 含义与“200 OK”基本相同,但响应头后没有 body 数据。
- 206 Partial Content:“部分所含之物”
- HTTP 分块下载或断点续传的基础,在客户端发送“范围请求”、要求获取资源的部分数据时出现
- 与 200 一样,也是服务器成功处理了请求,但 body 里的数据不是资源的全部,而是其中的一部分
- 伴随着头字段“Content-Range”,表示响应报文里 body 数据的具体范围,供客户端确认
例如“Content-Range: bytes 0-99/2000”,意思是此次获取的是总计 2000 个字节的前 100 个字节
3xx
- 表示客户端请求的资源发生了变动,客户端必须用新的 URI 重新发送请求获取资源,也就是通常所说的“重定向”。
- 301 Moved Permanently
- “永久重定向”,含义是此次请求的资源已经不存在了,需要改用**新的 URI **再次访问。
- 302 Found
- 俗称“临时重定向”,意思是请求的资源还在,但需要暂时用**另一个 URI **来访问
- 301 和 302 都会在响应头里使用字段 Location 指明后续要跳转的 URI,最终的效果很相似,浏览器都会重定向到新的 URI。
- 304 Not Modified :未调整
- 用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制。
- 不具有通常的跳转含义,但可以理解成“重定向已到缓存的文件”(即“缓存重定向”)。
4xx
- 客户端发送报文有误
- 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:请求头某个字段或总体太大;
5xx
- 表示客户端请求报文正确,但服务器在处理时内部发生了错误,无法返回应有的响应数据,是服务器端的“错误码”
- 500 Internal Server Error
- 和 400 类似,但是对服务器友好。
- 501 Not Implemented
- 客户端请求的功能不支持
- 502 Bad Gateway
- 通常是服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误,但具体的错误原因也是不知道的。
- 503 Service Unavailable
- 表示服务器当前很忙,暂时无法响应服务
- 临时的
- 503 响应报文里通常还会有一个“Retry-After”字段,指示客户端可以在多久以后再次尝试发送请求。
疑问
-
你在开发 HTTP 客户端,收到了一个非标准的状态码,比如 4××、5××,应当如何应对呢?
- 目前客户端基本都是解析成失败的情况,大部分给个失败错误友好界面。
-
你在开发 HTTP 服务器,处理请求时发现报文里缺了一个必需的 query 参数,应该如何告知客户端错误原因呢?
- 在返回body里面写明错误原因,状态码一般给500。