11 响应状态码
状态行的结构
状态码
一个十进制数字,以代码的形式表示服务器对请求的处理结果。RFC 标准里规定的状态码是三位数,取值范围就是从 000 到 999。
数字的第一位表示分类,100~599 五类的具体含义是:
- 1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作;
- 2××:成功,报文已经收到并被正确处理;
- 3××:重定向,资源位置发生变动,需要客户端重新发送请求;
- 4××:客户端错误,请求报文有误,服务器无法处理;
- 5××:服务器错误,服务器在处理请求时内部发生了错误。
1××
属于提示信息,是协议处理的中间状态。
101 Switching Protocols
2××
表示服务器收到并成功处理了客户端的请求。
- 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 个字节)。
3××
表示客户端请求的资源发生了变动,客户端必须用新的 URI 重新发送请求获取资源,即重定向。
- 301 Moved Permanently:永久重定向,此次请求的资源已经不存在了,需要改用新的 URI 再次访问;
- 302 Found:临时重定向,请求的资源还在,但需要暂时用另一个 URI 来访问;
- 304 Not Modified:用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制。可以理解为重定向已到缓存的文件,即缓存重定向。
301 和 302 在响应头里使用字段 Location 指明后续要跳转的 URI,浏览器都会重定向到新的 URI。
4××
表示客户端发送的请求报文有误,服务器无法处理。
- 400 Bad Reques:通用的错误码,表示请求报文有错误,但具体是数据格式错误、缺少请求头还是 URI 超长没有明确说;
- 403 Forbidden:实际上不是客户端的请求出错,而是服务器禁止访问资源(信息敏感、法律禁止等),服务器友好一点可以在 body 里详细说明拒绝请求的原因;
- 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:是一个通用的错误码,服务器究竟发生了什么错误不知道;
- 501 Not Implemented:表示客户端请求的功能还不支持;
- 502 Bad Gateway:通常是服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误,但具体的错误原因不知道;
- 503 Service Unavailable:表示服务器当前很忙,暂时无法响应服务。响应报文里通常会有一个 Retry-After 字段,指示客户端可以在多久以后再次尝试发送请求。