学科分类
目录
Java Web

HTTP响应状态行

HTTP响应状态行位于响应消息的第一行,它包括三个部分,分别是HTTP协议版本、一个表示成功或错误的整数代码(状态码)和对状态码进行描述的文本信息,具体示例如下:

HTTP/1.1 200 OK

上面的示例就是一个HTTP响应消息的状态行,其中HTTP1.1是通信使用的协议版本,200是状态码),OK是状态描述,说明客户端请求成功。需要注意的是,请求行中的每个部分需要用空格分隔,最后要以回车换行结束。

关于协议版本和文本信息,大家都比较容易理解,而HTTP的状态码对大家来说则比较陌生,接下来就针对HTTP的状态码进行具体分析。

状态代码由3位数字组成,表示请求是否被理解或被满足。HTTP响应状态码的第一个数字定义了响应的类别,后面两位没有具体的分类,第一个数字有五种可能的取值,具体介绍如下所示:

1xx:表示请求已接收,需要继续处理

2xx:表示请求已成功被服务器接收、理解、并接受

3xx:为完成请求,客户端需进一步细化请求

4xx:客户端的请求有错误

5xx:服务器端出现错误

下面通过表1至表5对HTTP1.1协议版本下的5种类别的状态码、状态信息(每个状态码后面小括号中的内容就是状态信息)及其作用分别进行说明。

表1 1xx状态码

状态码 说明
100(继续) 告诉客户端应该继续请求。如客户端发送一个值为100-continue的Expect头字段,询问服务器是否可以在后面的请求中发送一个附加文档。这种情况下,如果服务器返回100状态码,则告诉客户机可以继续,如果返回417状态码,则告诉客户端不能接收下次请求中附加的文档
101(切换协议) 如果客户端发送的请求要求使用另外一种协议与服务器进行对话,服务器发送101响应状态码表示自己将遵从客户端请求,转换到另外一种协议

表2 2xx状态码

状态码 说明
200(正常) 客户端的请求成功,响应消息返回正常的请求结果
201(已创建) 服务器已经根据客户端的请求创建了文档,文档的URL为响应消息中Location响应头的值
202(已接受) 客户端的请求已被接受,但服务器的处理目前尚未完成,比如说对于批处理的任务
203(非权威信息) 文档已经正常返回,但一些实体头可能不确切,使用的是本地缓存或者第三方信息,而不是最原始的(最权威的)信息
204(无内容) 规定浏览器显示已缓存的文档。服务器只会回送一些响应消息头,而不会回送实体内容。如果用户刷新某个页面时,并且服务器能够确定客户端当前显示的页面已经是最新的,这种功能就很有用,不用向客户端传送文档内容,节省了网络流量和服务器处理时间
205(重置内容) 表示没有新的文档,浏览器应显示原来的文档,但要重置文档的内容,例如,清除表单字段中已经存在的内容
206(部分内容) 当客户端发送的请求消息中包含一个Range头(可能还包含一个和Range头一起使用的If-Range头)请求文档的部分内容,如果服务器按客户端的要求完成了这个请求,就会返回一个206的状态码

表3 3xx状态码

状态码 说明
300(多项选择) 客户端请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提供一个优先选择的文档,它应该把文档的URL作为Location响应消息头的值返回,这样客户端可以根据Location头的值进行自动跳转
301(永久移动) 指出被请求的文档已经被移动到别处,此文档新的URL地址为响应头Location的值,浏览器以后对该文档的访问会自动使用新的URL地址
302(找到) 和301类似,但是Location头中返回的URL是一个临时的、而非永久的地址
303(参见其它) 和302类似,很多客户端处理303状态码的方式和302一样
304(未修改) 如果客户端有缓存的文档,它会在发送的请求消息中附加一个If-Modified-Since请求头,表示只有请求的文档在If-Modified-Since指定的时间之后发生过更改,服务器才需要返回新文档。状态码304表示客户端缓存的版本是最新的,客户端应该继续使用它。否则,服务器将使用状态码200返回所请求的文档
305(使用代理) 客户端应该通过Location头所指定的代理服务器获得请求的文档
307(临时重定向) 和302类似。按照规定,如果浏览器使用POST方式发出请求,只有响应状态码为303时才能重定向,但实际上许多浏览器对302状态码也按303状态码来处理。由于这个原因,HTTP1.1新增了307状态码,以便更加清楚的区分几个状态码:如果服务器发送303状态码,浏览器可以重定向GET和POST请求;如果是307状态码,浏览器只能重定向GET请求

表4 4xx状态码

状态码 说明
400(请求无效) 客户端的请求中有不正确的语法格式。在使用浏览器发送请求时一般是不会遇到这种情况,除非使用telnet或者自己编写的客户端
401(未经授权) 当客户端试图访问一个受口令和密码保护的页面,且在请求中没有使用Authorization请求头传递用户信息时,服务器返回401状态码,同时结合一个www-Authenticate响应头来提示客户机应该重新发出一个带有Authorization头的请求消息
402(需要付款) 保留状态码,为以后更高版本的HTTP协议使用
403(禁止) 服务器理解客户端的请求,但是拒绝处理。通常由于服务器上文件或目录的权限设置导致
404(找不到) 这个状态码很常见,表示服务器上不存在客户端请求的资源
405(不允许此请求方式) 请求行中的请求方式对指定的资源不适用。例如,有的资源只能用GET方式访问,当使用POST方式访问时,服务器将返回405。405状态码通常伴随这Allow响应头一起使用,Allow响应头指定有效的请求方式
406(不能接受) 客户端请求的资源已经找到,但是和请求消息中Accept、Accpet-Charset、Accept-Encoding、Accept-Language请求头的值不兼容
407(需要代理服务验证) 由代理服务器向客户端发送的状态码,配合Proxy-Authenticate响应头一起使用,表示客户端必须经过代理服务器的授权。客户端再次发送请求时,应该带上一个Proxy-Authorization请求头
408(请求超时) 在服务器等待的时间内,客户端没有发出任何请求
409(冲突) 由于请求和资源当前的状态相冲突,导致请求不能成功。这个状态码通常和PUT请求有关,例如,要上传的文件覆盖一个正在服务器端打开的文件
410(离开) 请求的文档已经不再可用,而且服务器不知道应该重定向到哪个地址。410通常表示文档被永久的移除了,而不像404那样表示由于未知的原因文档不可用
411(需要长度) 请求消息中包含了实体内容,却没有包含指定内容长度的Content-Length请求头
412(为满足前提条件) 请求头中的一些前提条件在服务器中测试失败
413(请求实体过大) 请求消息的大小超过了服务器愿意或者能够处理的范围,服务器会关闭连接,阻止客户端继续请求。如果服务器认为自己稍后能够再处理该请求,则在响应消息中发送一个Retry-After响应头告诉客户端不能处理只是暂时的,稍后可以再次尝试请求
414(请求URI过长) 请求的URI(这里就是指URL)太长,服务器无法进行解释处理。这种情况很少发生,一般是客户端误把POST请求当成GET请求进行处理
415(不支持的媒体类型) 请求消息中实体内容的格式不被服务器所支持
416(请求的范围不正确) 当客户端请求消息中的Range头指定的范围和请求资源没有交集,服务器会返回416状态码
417(预期失败) 可以被服务器或者代理服务器回送。当客户端的请求消息中包含Expect请求头,Expect头中的请求服务器不支持,或者代理服务器明确知道服务器不支持,则会回送417状态码

表5 5xx状态码

状态码 说明
500(内部服务器错误) 最常见的服务器错误。大部分情况下,是服务器端的CGI、ASP、JSP等程序发生了错误,一般服务器会在相应消息中提供具体的错误信息
501(未实现) 服务器不支持HTTP请求消息使用的请求方式
502(无效网关) 服务器作为网关或者代理访问上游服务器,但是上游服务器返回了非法响应
503(服务不可用) 由于服务器目前过载或者处于维护状态,不能处理客户端的请求。也就是说这种情况只是暂时的,服务器会回送一个Retry-After头告诉客户端何时可以再次请求。如果客户端没有接收到Retry-After响应头,会把它当做500状态码来处理
504(网关超时) 服务器作为网关或者代理访问上游服务器,但是未能及时获得上游服务器的响应
505(不支持HTTP版本) 服务器不支持请求行中的HTTP版本。响应消息中会描述服务器为什么不支持该HTTP版本以及支持的HTTP版本

表1到表5列举了HTTP协议的大多数状态码,这些状态码无需记忆。接下来列举几个Web开发中比较常见的,具体如下:

● 200:表示服务器成功处理了客户端的请求。

● 302:表示请求的资源临时从不同的URI响应请求,但请求者应继续使用原有位置 来进行以后的请求。例如,在请求重定向中,临时URI应该是响应的Location头字段所指向的资源。

● 404:表示服务器找不到请求的资源。例如,访问服务器不存在的网页经常返回此状态码。

● 500:表示服务器发生错误,无法处理客户端的请求。

点击此处
隐藏目录