Status-Code给客户端提供了事物处理结果的方式,由三位数字组成,很少听说的1XX,经常看到200,304,404等状态码,除此之外,在应用程序当中,通常根据返回码可以定位客户端和服务器的异常,所以了解他们的含义十分必要
信息性状态码100~199
这些status-code比较少见,因为是HTTP/1.1才有的
100 Continue 说明收到了请求的初始部分,请客户端继续,发送了这个状态码之后,服务器在收到请求之后必须进行响应 101 Switching Protocols 说明服务器正在根据客户端的指定,将协议切换成Update首部所列的协议
100 Continue状态码可以优化下面情况,HTTP客户端应用程序有一个主体部分要发送给服务器,但是希望在发送之前验证下服务器是否会接受这个主体
(1)客户端与100 Continue
前提如果客户端在向服务器发送一个实体,并且愿意在发送实体之前等待100 Continue的响应,那么客户端就发送一个携带了值为100 Continue的Expect请求首部;假如客户端没发送实体,就不应该发送100 Continue Expect首部,因为这样会误导服务器以为客户端要发送实体
实际上也可以认为是一种优化,客户端为了避免向服务器发送一个对方无法处理或者使用的实体,可以使用100 Continue;而发送了值为100 Continue的Expect首部的客户端不应该永远等到服务器发送100 Continue响应,超过了一定时间之后,客户端应该直接将实体发送出去;客户端实现者也要做好应对非预期100 Continue响应的准备
(2)服务器和100 Continue
如果服务器受到了一条带有值为100 Continue的Expect首部的请求,它会使用100 Continue响应或者一条错误码来进行响应,服务器不会向没有发送100 Continue Expect的客户端发送100 Continue的状态码,除非是有些服务器出现了故障
如果某种原因,服务器在发送100 Continue响应之前收到了实体部分,说明客户端已经决定继续发数据,如此一来,服务器就不需要发送这个状态码了;但服务器读完了请求之后,还是为请求发送一个响应状态码;如果服务器在收到100 Continue Expect的请求,但决定在读取实体的主体部分之前结束请求(因为出错?),就不仅仅发送一条响应来关闭连接,这样会影响客户端接收响应
(3)代理和100 Continue
如果代理从客户端受到了一条带有100 Continue Expect的请求,而且代理知道或者不知道下一跳服务器是HTTP/1.1兼容的,它都应该将Expect首部放到请求中继续转发,但是如果知道下一跳只能兼容HTTP/1.1以前的版本,就会以417 Expectation Failed错误响应
如果代理决定帮助HTTP/1.1以前的客户端,请求中放入了100 Continue Expect首部,那么当服务器响应之后,受到了100 Continue响应,代理就不会将100 Continue响应转发给客户端,因为客户端可能不知道该怎么办(兼容问题)
代理会维护一些下一跳服务以及所支持HTTP版本的状态信息,这样代理可以更好地处理那些带有100 Continue Expect的请求
成功状态码200~299
200是最常见的状态码;客户端发起请求时,这些请求通常成功,而服务器用一组表示成功的状态码来对应不同类型的请求
200 OK 请求没问题,实体的主体部分包含了所请求的资源 201 Created 用于创建服务器对象的请求(比如PUT),响应的实体主体部分中应该包含各种 引用了已创建的资源的URL,Location首部包含的是最具体的引用;服务器必须 在发送这个状态码之前创建好对象 202 Accepted 请求已经被接受,但服务器还未对其执行任何动作,不能保证服务器会完成这个 请求;这只是意味着接受请求时,它看起来是有效的;服务器应该在实体的主体 部分包含对请求状态的描述,或许还应该有对请求完成时间的估计或者包含一个 指针,指向可以获取此信息的位置 203 Non-Authoritative Information 实体首部包含的信息不是来自于源端服务器,而是来自资源的一份副本,如果中 间节点上有一份资源副本,但无法或者没有对它所发送的与资源有关的元信息( 首部)进行验证,就会出现这种情况;这种响应码并不是非用不可,如果实体头 部来自源端服务器,响应为200状态的应用程序就可以将其作为一种可选项使用 204 No Content 响应报文中包含若干首部和一个状态行,但没有实体的主体部分,主要用于在浏 览器不转为显示新文档的情况下,对其进行更新(比如刷新一个表单页面) 205 Reset Content 另一个主要用于浏览器的代码,负责告诉浏览器清楚当前页面中所有HTML表单元素 206 Partial Content 成功执行了一个部分或Range(范围)请求;客户端可以通过一些特殊的首部来 获取部分或者某个范围内的文档,这个状态码就说明范围请求成功了;206响应中 必须包含Content-Range,Date以及ETag或者Content-Location首部
重定向状态码300~399
重定向的状态码要么直接告诉客户端到新的位置让客户端访问,要么就提供一个替代的响应而不是资源的内容;假如资源已经被移动,可发送一个重定向的状态码和一个可选的Location首部来告诉客户端资源已经移走,以及可以在哪里找到,这样,浏览器可以在不打扰客户端使用者的情况下,透明地转入到新的位置了
请求报文 GET /lihui.txt HTTP/1.1 Host: www.lihuia.com Accept: * 响应报文 HTTP/1.1 301 OK Location: http://www.lilei.com/ Content-Length: 43 Content-Type: text/plain Please go to another site, www.lilei.com 请求报文 GET / HTTP/1.1 Host: www.lilei.com Accept: * 响应报文 HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1000 ...................
可以通过某些重定向状态码对资源的应用程序本地副本与源端服务器上的资源进行验证;比如HTTP应用程序可以查看其资源的本地副本是否依然是最新的,或者在源端服务器上资源是否被修改过
下面的例子,客户端发送了一个特殊If-Modified-Since首部,说明只读取2000年10月之后修改过的文档,在这个日期之后,此文档从未被修改过,因此服务器就回送一个304状态码,而不是文档内容
客户端上有以前请求过的 http://www.lihuia.com/lihui.html 副本 请求报文 GET /lihui.html HTTP/1.1 Host: www.lihuia.com Accept: * If-Modified-Since: Tue, Oct 1 2000 00:00:00 GMT 验证没有被修改过 响应报文 HTTP/1.1 304 Not Modified .................. 说明从最后一次请求此文档以来,原始文档从没被修改过, 所以浏览器显示的是本地副本
从对那些包含了重定向状态码的非HEAD请求进行响应时,最好包含一个实体,并在实体中包含描述信息和指向多个重定向URL的链接
303 Multiple Choices 客户端请求一个实际指向多个资源的URL时会返回这个状态码;比如服务器上有 某个HTML文档的英语和法语版本;返回这个代码时会带有一个选项列表;这样 用户就可以选择他希望使用的哪一项了,有多个版本可用时,客户端需要沟通 解决;服务器可以在Location首部包含首选URL 301 Moved Permanently 在请求的URL已经被移除的时候返回这个状态码;响应的Location首部中应该包 含资源现在所处的URL 302 Found 与301类似,但是客户端应该使用Location首部给出的URL来临时定位资源;将来 的请求仍应使用老的URL 303 See Other 告知客户端应该用另一个URL来获取资源;新的URL位于响应报文的Location首部; 其主要目的是允许POST请求的响应将客户端定向到某个资源上去 304 Not Modified 客户端可以通过所包含的请求首部,使其请求变成有条件的;如果客户端发起了 一个条件GET请求,而资源最近也从来没被修改的话,就可以用这个状态码来说明 资源未被修改,带有这个状态码的响应不应该包含实体的主体部分 305 Use Proxy 说明必须通过一个代理才能访问资源;代理的位置由Location首部给出;重要的 一点是,客户端是相对某个特定资源来解析这条响应的,不能假定所有请求,甚至 所有对持有所请求资源的服务器的请求都通过这个代理来进行;如果客户端错误地 让代理介入了某条请求,可能会引发破坏性的行为,而且会造成安全漏洞 306 目前还没使用 307 Temporary Redirect 与301状态码类似;但客户端应该使用Location首部给出的URL来临时定位资源;将来 的请求应该使用老的URL
可以看到302,303,307状态码似乎差异不大,这些状态码用法的差别,源自于HTTP/1.0和HTTP/1.1应用程序对这些状态码处理方式的不同
当HTTP/1.0客户端发起一个POST请求时候,并在响应中收到了302重定向状态码时,它会接收Location首部的重定向URL,并向那个URL发起一个GET请求,而不是会像原始请求中那样发起POST请求
HTTP/1.0服务器希望HTTP/1.0客户端的做法:如果服务器收到来自客户端的POST请求之后发送302状态码,服务器就期望客户端能够接受重定向URL,并向重定向的URL发送一个GET请求
而HTTP/1.1使用303状态码来实现跟上面同样的行为;为了解决这个问题,HTTP/1.1规范指出,对于HTTP/1.1客户端,用307状态码取代302状态码来进行临时重定向,这样服务器就可以将302状态码保留起来,为HTTP/1.0客户端使用了,这样一来,服务器要选择适当的重定向状态码放入重定向响应中发送,就必须查看客户端HTTP版本了
客户端错误状态码400~499
有时候客户端发送一些服务器无法处理的东西,比如格式错误的请求报文,或者最常见的请求了一个根本不存在的URL;很多客户端的错误浏览器没有告诉用户就处理掉了,但比如404 Not Found还是会传递给用户
400 Bad Request 告诉客户端它发送了一个错误请求 401 Unauthorized 与适当的首部一同返回,在这些首部中请求客户端在获取对资源的访问权之前,对自己进行认证 402 Payment Required 现在这个状态码还未使用,但已经被保留 403 Forbidden 用于说明请求被服务器拒绝了;如果服务器想说明为什么拒绝请求,可以包含实体的主体部分来 描述原因,但这个状态码通常是在服务器不想说明拒绝原因的时候使用 404 Not Found 说明服务器无法找到所请求的URL,通常会包含一个实体,以便告诉给用户 405 Method Not Allowed 发起的请求中带有请求的URL不支持的方法,会使用次状态码;应该在响应中包含Allow首部,以便 告诉客户端对所请求的资源可以使用哪些方法 406 Not Acceptable 客户端可以指定参数来说明他们希望接收什么类型的实体;服务器没有与客户端可接受的URL相 匹配的资源时,使用次状态码;通常服务器会包含一些首部,以便客户端弄清楚为什么请求无法满足 407 Proxy Authentication Required 与401状态码类似,但用于要求对资源进行认证的代理服务器 408 Request Timeout 如果客户端完成请求所花的时候太长,服务器可以回送此状态码并关闭连接;超时时长随着服务器的 不同所有不同,但通常对所有的合法请求来说,都是够长的 409 Conflict 用于说明请求可能在资源上引发了一些冲突;服务器担心请求会引发冲突时,发送此状态码,响应中 应该包含描述冲突的主体 410 Gone 与404类似,只是服务器曾经拥有过此资源,主要用于WEB站点的维护,这样服务器的管理者可以在 资源被移除的情况下通知客户端了 411 Length Required 服务器要求在请求报文中包含Content-Length首部时使用 412 Precondition Failed 客户端发起了条件请求,而且其中一个条件失败了的时候使用;客户端包含了Expect首部时发起的就是 条件请求 413 Request Entity Too Large 客户端发送的实体主体部分比服务器能够或者希望处理的要大时,使用此状态码 414 Request URI Too Long 客户端所发起的请求中的URL比服务器能够或者希望处理的要长时,使用此状态码 415 Unsupported Media Type 服务器无法理解或者无法支持客户端所发实体的内容类型时,使用此状态码 416 Requested Range Not Satisfiable 请求报文所请求的是指定资源的某个范围,而此范围无效或者无法满足时,使用此状态码 417 Expectation Failed 请求的Expect请求首部包含了一个期望,但服务器无法满足此期望时,使用此状态码;如果代理或者 其它中间应用程序有确切证据说明源端服务器会为某请求产生一个失败的期望,就可以发送这个响应 状态码
服务器错误状态码500~599
有时候客户端发送了有效请求,但是服务器自身出错,有可能服务器除了问题,子元素除了错误
500 InternalServer Error 服务器遇到一个妨碍它为请求提供服务的错误时,使用此状态码 501 Not Implemented 客户端发起的请求超出了服务器的能力范围,比如使用了服务器不支持的请求方法 会使用此状态码 502 Bad Gateway 作为代理或者网关使用的服务器从请求的服务器从请求响应链的下一条链路上收到 了一条伪响应,比如法务连接到父网关时,使用此状态码 503 Service Unavailable 说明服务器现在无法为请求提供服务,但将来可以;如果服务器知道什么时候资源 会变为可用的,可以在响应中包含一个Retry-After首部 504 Gateway Timeout 与状态码408类似,只是这里的响应来自一个网关或者代理,它们在等待另一个服务 器对其请求进行响应的时候超时了 505 HTTP Version Not Supported 服务器收到的请求使用了它无法或者不愿意支持的协议版本时,使用此状态码;有些 服务器应用程序会选择不支持协议的早期版本