彻底搞懂 HTTP 报文、报文信息以及 HTTP 状态码
一、HTTP 报文
用于HTTP协议交互的信息被称为HTTP报文,
HTTP 报文分为请求报文和响应报文;
请求报文:客户端发送请求时的 HTTP 请求报文;
响应报文:服务器响应客户端请求时发送的响应报文
二、HTTP 报文信息
HTTP 报文大致可分为报文首部和报文主体两块,其中报文主体不是必须要有的;
报文首部:服务器或者客户端需要处理的请求或响应的属性和内容;
报文主体:请求或者响应时需要发送的数据
请求报文和响应报文的首部内容由以下数据组成
- 请求行:包含用于请求的方法,请求URI和HTTP版本。
- 状态行:包含表明响应结果的状态码,原因短语和HTTP版本。
- 首部字段:包含表示请求和响应的各种条件和属性的各类首部。一般有4种首部,分别是:通用首部、请求首部、响应首部和实体首部。
- 其他:可能包含HTTP的RFC里未定义的首部(Cookie等)。
三、HTTP 状态码
HTTP 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。
借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
响应的状态码可描述请求的处理结果
状态码的类别
数字中的第一位指定了响应类别,后两位无分类。响应类别有以下5种:
状态码分类
下面主要介绍一些常用的 HTTP 状态码:
- 状态码 200 表示从客户端发来的请求在服务器端被正常处理了;
在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。比如,
使用GET方法时,对应请求资源的实体会作为响应返回;
使用HEAD方法时,在响应中只返回首部,不会返回实体的主体部分; - 状态码 202 表示已经接受请求但未处理完成;
- 状态码 204 表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分;
也不允许返回任何实体的主体。比如,当从浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不发生更新
- 状态码 206 表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。
- 状态码 300 表示请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端;
- 状态码 301 表示请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替;
当指定资源路径的最后忘记添加斜杠“/”,就会产生301状态码。
http://baidu.com/search - 状态码 302 表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问;
和 301 状态码相似,但 302 状态码代表的资源不是被永久移动,只是临时性质的。
http://baidu.com/search/ - 状态码 303 表示由于请求对应的资源存在着另一个URI,应使用 GET 方法定向获取请求的资源;
303 状态码和 302 状态码有着相同的功能,但 303 状态码明确表示客户端应当采用 GET 方法获取资源,这点与302状态码有区别
- 状态码 304 表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回 304 Not Modified;
304 状态码返回时,不包含任何响应的主体部分。304 虽然被划分在 3XX 类别中,但是和重定向没有关系。
- 状态码 400 表示客户端请求的语法错误,服务器无法理解;
- 状态码 401 表示请求要求需要有通过 HTTP 认证的认证信息,如果之前已进行过1次请求,则表示用户认证失败;
- 状态码 403 表示服务器理解请求客户端的请求,但是拒绝执行此请求;
服务器端没有必要给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分对原因进行描述,这样就能让用户看到了
- 状态码 404 NotFound表示服务器无法根据客户端的请求找到相应的资源;
- 状态码 408 表示服务器等待客户端发送的请求时间过长,超时;
- 状态码 500 表示服务器执行请求时内部发生错误,无法完成该请求;
- 状态码 503 表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
状态码和状况的不一致不少返回的状态码响应是错误的,但是用户可能察觉不到这点。比如Web应用程序内部发生错误(此时应该返回状态码 500),状态码依然返回200 OK,这种情况也经常遇到。
-- 以上主要图文来源《图解 HTTP》