本文为极客时间《透视HTTP协议》笔记
响应报文格式
服务器在收到请求报文,解析后需根据对应情况进行对请求的处理,最终以响应报文的形式发回客户端。
响应报文=响应头+响应体数据
响应头=状态行+头字段 如HTTP/1.1 200 OK
状态码
其中响应头中version,reason 部分常被忽略,Status Code以代码的形式表示服务器对请求的处理结果,作为客户端处理服务器响应的主要依据。
其中它的名字是“状态码”而不是“错误码”。也就是说,它的含义不仅是错误,更重要的在于表达HTTP处理的状态,错误码只是其中的一种。
目前RFC规定状态码为000-999中的三位数字,但为了更加容易区分与操作,RFC规定状态码的首位数作为分类使用,目前共可用范围为100-599。(目前RFC标准中的状态码共有41,但状态码是开放的在不与已存在的状态码重复的情况下可自定义新的状态码,如Apache,Nginx等Web服务器都有些特有的状态码)。
五类具体含义为:
1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作。
2××:成功,报文已经收到并被正确的处理。
3××:重定向,资源位置发生变动,需要客户端重新发送请求;
4××:客户端错误,请求报文有误,服务器无法处理;
5××:服务器错误,服务器在处理请求时内部发生了错误。
从上面五类的含义中可以看出,状态码表示出的状态不仅仅是某一方的责任,而需要服务器和客户端共同进行处理。
常用状态码
1xx
1xx属于服务处理的提示信息,协议处理的中间状态,实际用到的情况很少。
101 Switching Protocols 表示客户端使用 Upgrade 头字段,要求在 HTTP 协议的基础上改成其他协议继续通讯。而服务器同意后就会发出101,之后将不会使用HTTP来通讯。
2xx
2xx表示服务器成功接受到并处理的请求。
200 OK 一切正常,若非HEAD请求那么t通常会有body数据。
204 No Content 一起正常但响应头后无body数据。
206 Partial Content 是HTTP是 HTTP 分块下载或断点续传的基础,在客户端发送“范围请求” 时出现。 body中的数据不是全部,一般会伴随着标记Content-Range共同出现。
3xx
3xx表示客户端请求的资源发生了变动,需发送新的URI进行请求。都会在响应头里使用字段Location指明后续要跳转的 URI。
301 Moved Permanently 永久重定向,请求的资源永久已经不在,需更换访问URI。
302 Found 临时重定向,即需暂时更换访问URI。
304 Not Modified 资源已经重定义到缓存文件中。
4xx
4xx表示客户端发送的请求报文有误,服务器无法处理. 一般4xx 的错误应尽量返回详细友好的错误信息,可自定义错误代码来明确通知客户端错误在哪。
400 Bad Request 是一个通用的错误码,表示请求报文格式出错,但具体错误不详。开发中应尽量少使用400,应使用表示更明确的状态码。
403 Forbidden 实际上不是客户端的请求出错,而请求的资源被禁止访问,可在body中进一步说明原因。
404 Not Found 资源无法找到,很笼统的错误提示。
一些较为明确的4xx状态码
405 Method Not Allowed:不允许使用某些方法,如不能使用GET只能用POST
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
5××类状态码表示客户端请求报文正确,但服务器在处理时内部发生错误,是服务器的错误码。(通常处于安全考虑不会讲服务器内部的详细信息暴露给客户端,故可能5xx状态码一般为一个比较笼统的错误如500等。)
500 Internal Server Error 通用错误码
501 Not Implemented 表示客户端请求的功能还不支持,如方法还未实现。
502 Bad Gateway 通常是服务器作为网关或者代理时返回的错误码。
503 Service Unavailable 表示服务器正常,访问服务器后端的服务器出错误。
响应报文里通常还会有一个“Retry-After”字...
极客时间版权所有: https://time.geekbang.org/column/article/102483