HTTP消息

一.消息类型:请求消息Request和响应消息Response

二.消息格式:包括一个起始行start-line,零个或多个消息头字段message-header,一个空行CRLF以指示头字段结束,零个或一个消息体message-body

请求消息和响应消息的起始行:start-line=Request-Line|Status-Line

(1)起始行start-line

  请求行:包括一个表示请求方法的字符串,一个表示请求方法所作用资源的标识符Request-URI,所使用的HTTP版本号HTTP-version,以及一个表示请求行结束的回车换行符CRLF,这些字符串之间使用空格作为间隔

1.请求方法:请求行中的方法描述了对于指定的资源应该执行的动作,常用的方法分为8种

GET:从服务器上获取指定的资源,如HTML页面

HEAD:从服务器上获取关于指定资源的元信息,如某个HTML页面的最近修改时间,文件大小

POST:向服务器发送数据,供服务器端的指定程序进行处理,POST方法的作用是要求服务器将请求中包含的实体作为请求URI所指定资源的一部分。POST方法是一种抽象的方法,它的具体含义往往取决于服务器以及请求URI所指定的资源的类型。GET方法不同,GET传送给服务器端应用程序的数据是包含在请求消息的请求行中的(请求URI)

PUT:向服务器发送数据,存储到服务器上指定的位置

DELETE:删除服务器上的指定资源

TRACE:要求服务器将客户的请求消息作为响应消息的消息体原样返回给客户

CONNECT:保留供能够动态地切换为Tunnel的Proxy使用

OPTIONS:供客户号确定与资源有关的选项、需求,或者确定服务器所具有的能力

  响应行(状态行):包括协议版本号,状态码(数值形式)以及相关的原因说明(文本形式),使用空格作为间隔

状态码:是一个三位数字的整数,表示服务器试图理解并满足客户请求的执行结果。原因说明的目的是为 状态码提供一个简短的文本形式的描述。状态码是供程序使用的,原因说明是供用户理解的。

状态码的分类:在组成状态码的3为数字,第一位表示响应消息的类型,取值范围1~5,从而分为5个大类:

1xx:一般消息Information,代表服务器给出的一种暂时性的响应,此时在响应消息中没有消息体

2xx:成功Successful

3xx:重定向Redirection,表示为完成请求客户还需采取进一步的动作

4xx:客户错误client error,表示客户的请求有语法错误或不能满足

5xx:服务器错误server error,表示服务器无法完成一个正确的客户请求,可能是因为服务器缺乏完成请求的能力,也可能是在完成客户请求时发生了一个意外错误

 状态码 302 是一个 临时重定向; 它意味着, 资源被被临时从这里移动走了; (并且临时地址在Location 头里面给出)。状态码301永久重定向; 它意味着,资源被永久的移动了; (并且在Location头里面给出了新的地址)。如果你得到302状态码和一个新地址, http规范要求你访问新地址来获得你要的资源,但是下次你要访问同样的资源的时候你应该重新尝试旧的地址。但是如果你得到301状态码和新地址, 你从今以后都应该使用新的地址。

(2)消息头的字段的类型:

1.通用消息头general-header:既可以用在请求消息又可以用在响应消息中但不能用于传输的实体

通用头字段分为9种:Cache-Control、Connection、Date、Pragma、Trailer、Transfer-Encoding、Upgrade、Via、Warning

Cache-Control:用于指定在请求/响应链上所有缓存系统机制所必须遵循的指令。例如服务器在响应消息中加上通用头“Cache-Control:no-cache”表示该响应不应该被缓存

Connection:用于指定连接的参数,如Connection:close表示本次请求/响应后关闭连接

Date:用于表示消息产生的日期和时间

Pragma:用于指定特定实现的指令,这些指令将作用于请求/响应链上的所有接受者

Via:供网关或代理等来指定客户和源服务器之间的各个中介系统的名称以及所使用的协议

2.请求头request-header

  请求头中的各个字段使得客户可以向服务器传送有关请求的附加信息以及有关客户本身的信息,这些字段为请求限定符,起到了对请求方法作进一步说明、限定的作用,就好像请求方法的地位类似于程序设计中函数调用,而请求头字段的地位类似于函数调用参数

常用请求头字段:

Accept:表示客户在接收响应时所能接受的特定媒体类型,如“Accept:text/html”.Acceot-Charset、Accept-Encoding、Accept-language等头字段与Accept类似。这些字段主要用于在实现“服务器驱动的”类容协商时,客户给出首选的资源表示形式

Host:表示客户所请求的资源所在的Internet宿主机及其端口位置

If-Modified-Since/If-Unmodified-Since:该字段为请求方法设定了一个条件。如果所请求的资源在某个时间之后没有被修改过的话,那么就不要返回该资源,此时,服务器返回的响应为304 Not Modified,且响应没有消息体。该字段通常与GET请求方法一起使用,以最小的代价来有效地更新缓存过的资源

ETag 是另一个和最后修改时间检查达到同样目的的方法。使用ETag时,服务器在返回数据的同时在ETag头里返回一个哈希码(如何生成哈希码完全取决于服务器,唯一的要求是数据改变时哈希码也要改变)。当你再次请求同样的数据时,你在If-None-Match头里放入ETag值。如果数据没有发生改变,服务器将会返回304状态码。同最后修改时间检查一样,服务器发回的只有304 状态码,不会再一次给你发送同样的数据。

Range:为GET方法设定了一个条件,以获取资源中的一个或多个部分,而不是整个资源

If-Range:常与Range字段一起使用,如果资源没有被更新过,就将指定的部分传输给客户,否则就将更新过的资源整个传输给客户

Referer:供客户指出当前的请求URI是从何处获得的,该字段的目的是使得服务器可以进行一些统计,并采取适当的优化策略

User-Agent:给出了发送请求的客户的有关信息,通常客户应用程序的名称和版本号

Authorization:使用该字段来表明客户的身份来访问特定的需要认证的资源,该字段值包含了认证消息,如用户名称、口令

Proxy-Authorization:Proxy需要用户认证的时候

3.响应头reponse-header

给出了关于服务器的各种信息,或是进一步访问服务器上指定的信息

常用响应头字段:

Accept-Ranges:表示服务器是否允许客户使用带有Range字段的GET方法来获取指定资源的一部分

Location:将客户重定向到不同于请求URI的其它位置以完成客户的请求,该字段通常使用在状态码为‘3xx’(重定向)的消息中

Retry-After:通常用于状态码‘503’(Service Unavailable)的响应消息中,服务器利用该字段来告诉客户在多长时间之内它无法提供服务

Server:包含有关源服务器的信息,即服务端使用了何种软件来处理客户的请求

WWW-Authenticate:服务器有时会对特定的资源设定访问权限,即服务器先要对用户进行认证才允许客户访问资源。通常客户在提交请求是并不通过认证消息;此时服务器会返回状态码401(Unauthorized)的响应,同时响应消息中包含有“WWW-Authotiate”头字段,以表明服务器要用户提供何种认证消息

,例如:用户名称、口令

Proxy-Authenticate:有时Proxy也需要认证

 

4.实体头entity-header

头字段的格式:message-header=field-name“:”[field-value]

常用头字段:

Allow:列出了资源所支持的操作的集合,目的是将有关资源的合法操作通知接收者

Content-type:指出了发送给接收者的信息中所包含的实体正文的媒体类型,这样接收者就能够根据媒体类型对资源进行适当 的处理

Content-Encoding:是资源媒体类型的限定符,表示对消息中的实体采用了何种编码或方法

Content-Language:表示消息中包含的实体所使用的自然语言。

Content-Length:该字段表示消息中所包含实体正文的大小(以字节为单位)

Content-Range:表示当前所发送的实体是整个资源的一部分,同时指出了该部分在整个资源的位置

Last-Modified:表示消息中所包含资源的最后修改日期和时间,客户通常用该字段来判断自己目前所拥有的资源是否为最新版本

 

(3)消息体

消息体是用来承载与请求或响应相关的实体正文的。对于请求和响应而言,消息中所允许出现的消息体的格式是不一样的。

在请求消息中当消息头中包含Conten-Lenth或Transfer-Encoding头字段时意味着消息中包含消息体

在响应消息中是否包含消息体则取决于请求方法和响应状态码

实体:是作为请求或响应消息的有效载荷而传输的信息,实体消息分为两种:一是对资源进行描述的元数据,这部分数据时作为实体头entity-header来发送的,另一种是资源内容本身,这是作为实体正文来发送的,实体既可能包含在请求消息中,也可能包含在响应消息中

实体正文:指消息中包含的资源内容本身,实体正文的数据格式和编码有实体头字段Content-Type、Conten-Encoding的取值决定

 

 

posted @ 2012-09-17 00:50  Aveen  阅读(667)  评论(0编辑  收藏  举报
Top