超文本传输协议
HTTP(HypterText Transfer Protocol)是应用级协议,它适应了分布式超媒体协作系统对灵活性及速度的要求。它是一个一般的、无状态的、基于对象的协议,是一个简单的请求与响应协议,指定了客户端发送什么样的消息给服务端以及得到什么样的响应。
通过对其请求方法(request methods)进行扩展,可以被用于多种用途,比如命名服务器(name server)及分布式对象管理系统。HTTP的一个特性是其数据表现类型允许系统的构建不再依赖于要传输的数据。
HTTP状态码
状态代码(Status-Code)由3位数字组成,表示请求是否被理解或被满足。原因分析是用简短的文字来描述状态代码产生的原因。状态代码用来支持自动操作,原因分析是为人类用户准备的。客户端不需要检查或显示原因分析。
状态代码的第一位数字定义了回应的类别,后面两位数字没有具体分类。首位数字有5种取值可能:
1xx:保留,将来使用。
2xx:成功 - 操作被接收、理解、接受(received, understood, accepted)。
3xx:重定向(Redirection)- 要完成请求必须进行进一步操作。
4xx:客户端出错 - 请求有语法错误或无法实现。
5xx:服务器端出错 - 服务器无法实现合法的请求。
消息1xx(Informational 1xx)
该类状态代码用于表示临时回应。临时回应由状态行(Status-Line)及可选标题组成,
由空行终止。HTTP/1.0中没有定义任何1xx的状态代码,所以它们不是对HTTP/1.0请求的合法回应。实际上,它们主要用于实验用途,这已经超出本文档的范围。
成功2xx(Successful 2xx)
表示客户端请求被成功接收、理解、接受。
200 OK
请求成功。回应的信息依赖于请求所使用的方法,如下:
GET 要请求的资源已经放在回应的实体中了。
HEAD 没有实体主体,回应中只包括标题信息。
POST 实体(描述或包含操作的结果)。
201 Created
请求完成,结果是创建了新资源。新创建资源的URI可在回应的实体中得到。原
始服务器应在发出该状态代码前创建该资源。如果该操作不能立即完成,服务器必
须在该资源可用时在回应主体中给出提示,否则,服务器端应回应202(可被接受)。
202 Accepted
请求被接受,但处理尚未完成。请求可能不一定会最终完成,有可能被处理过程随
时中断,在这种情况下,没有办法在异步操作中重新发送状态代码。
202回应是没有义务的,这样做的目的是允许服务器不必等到用户代理和服务器间
的连接结束,就可以响应其它过程的请求(象每天运行一次的,基于批处理的过程)。
在某些回应中返回的实体中包括当前请求的状态指示、状态监视器指针或用户对请
求能否实现的评估信息。
204 No Content
服务器端已经实现了请求,但是没有返回新的信息。如果客户是用户代理,则勿需
为此更新自身的文档视图。该回应主要是为了在不影响用户代理激活文档视图的前
提下,进行script语句的输入及其它操作。该回应还可能包括新的、以实体标题形
式表示的元信息,它可被当前用户代理激活视图中的文档所使用。
重定向3xx(Redirection 3xx)
该类状态码表示用户代理要想完成请求,还需要发出进一步的操作。
301 Moved Permanently
请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此
资源。有编辑链接功能的客户端会尽可能地根据服务器端传回的新链接而自动更新
请求URI。
新的URL必须由回应中的位置域指定。除非是HEAD请求,否则回应的实体主体
(Entity-Body)必须包括对新URL超链接的简要描述。
如果用POST方法发出请求,而接收到301回应状态码。在这种情况下,除非用户
确认,否则用户代理不必自动重定向请求,因为这将导致改变已发出请求的环境。
注意:当在接收到301状态码后而自动重定向POST请求时,一些现存的用户代理
会错误地将其改为GET请求。
302 Moved Temporarily
请求到的资源在一个不同的URL处临时保存。因为重定向有时会被更改,客户端
应继续用请求URI来发出以后的请求。
新的URL必须由回应中的位置域指定。除非是HEAD请求,否则回应的实体主体
(Entity-Body)必须包括对新URL超链接的简要描述。
如果用POST方法发出请求,而接收到302回应状态码。在这种情况下,除非用户
确认,否则用户代理不必自动重定向请求,因为这将导致改变已发出请求的环境。
注意:当在接收到302状态码后而自动重定向POST请求时,一些现存的用户代理
会错误地将其改为GET请求。
304 Not Modified
如果客户端成功执行了条件GET请求,而对应文件自If-Modified-Since域所指定
的日期以来就没有更新过,服务器应当回应此状态码,而不是将实体主体发送给客
户端。回应标题域中只应包括一些相关信息,比如缓存管理器、与实体最近更新
(entity's Last-Modified)日期无关的修改。相关标题域的例子有:日期、服务器、
过期时间。每当304回应中给出的域值发生变化,缓存都应当对缓存的实体进行更
新。
客户端错误4xx(Client Error 4xx)
4xx类的状态码表示客户端发生错误。如果客户端在收到4xx代码时请求还没有完成,
它应当立即终止向服务器发送数据。除了回应HEAD请求外,不论错误是临时的还是永久
的,服务器端都必须在回应的实体中包含错误状态的解释。这些状态码适用于任何请求方法。
注意:如果客户端正在发送数据,服务器端的TCP实现应当小心,以确保客户端在关
闭输入连接之前收到回应包。如果客户端在关闭后仍旧向服务器发送数据,服务器会给客户
端发送一个复位包,清空客户端尚未处理的输入缓冲区,以终止HTTP应用程序的读取、解
释活动。
400 非法请求(Bad Request)
如果请求的语法不对,服务器将无法理解。客户端在对该请求做出更改之前,不应
再次向服务器重复发送该请求。
401 未授权(Unauthorized)
请求需要用户授权。回应中的WWW-Authenticate标题域(10.16节)应提示用户
以授权方式请求资源。客户端应使用合适的授权标题域(10.2节)来重复该请求。如果
请求中已经包括了授权信任信息,那回应的401表示此授权被拒绝。如果用户代理在多
次尝试之后,回应一样还是返回401状态代码,用户应当察看一下回应的实体,因为在
实体中会包括一些相关的动态信息。HTTP访问授权会在11节中解释。
403 禁止(Forbidden)
服务器理解请求,但是拒绝实现该请求。授权对此没有帮助,客户端应当停止重复
发送此请求。如果不是用HEAD请求方法,而且服务器端愿意公布请求未被实现原因
的前提下,服务器会将拒绝原因写在回应实体中。该状态码一般用于服务器端不想公布
请求被拒绝的细节或没有其它的回应可用。
404 没有找到(Not Found)
服务器没有找到与请求URI相符的资源。404状态码并不指明状况是临时性的还是
永久性的。如果服务器不希望为客户端提供这方面的信息,还回应403(禁止)状态码。
服务器错误5xx(Server Error 5xx)
回应代码以‘5’开头的状态码表示服务器端发现自己出现错误,不能继续执行请
求。如果客户端在收到5xx状态码时,请求尚未完成,它应当立即停止向服务器发送数
据。除了回应HEAD请求外,服务器应当在其回应实体中包括对错误情况的解释、并
指明是临时性的还永久性的。这类回应代码没有标题域,可适用于任何请求方法。
500 服务器内部错误(Internal Server Error)
服务器碰到了意外情况,使其无法继续回应请求。
501 未实现(Not Implemented)
服务器无法提供对请求中所要求功能的支持。如果服务器无法识别请求方法就会回
应此状态代码,这意味着不能回应请求所要求的任何资源。
502 非法网关(Bad Gateway)
充当网关或代理的服务器从要发送请求的上游(upstream)服务器收到非法的回应。
503 服务不可用(Service Unavailable)
服务器当前无法处理请求。这一般是由于服务器临时性超载或维护引起的。该状态
码暗示情况是暂时性的,要产生一些延迟。
注意:503状态码并没有暗示服务器在超载时一定要返回此状态码。一些服务器可
能希望在超载时采用简单处理,即断掉连接。