HTTP权威指南-第三章-HTTP报文自己理解

来源:互联网 发布:雅思词汇书推荐 知乎 编辑:程序博客网 时间:2024/04/28 22:21

http报文是简单的格式化数据块。http协议中拥有请求报文,响应报文。

一个报文由三部分组成,1.对报文进行描述的起始行(start line)  2.包含属性的首部(header)块  3.可选的,包含数据的主体(body)部分.


报文是具有一定格式的,不是随便一个文本就可以做报文。那么我们来看看报文的格式:

起始行和首部都是由行分隔的ASCII文本。每行都以一个由两个字符组成“行终止序列”作为结束标记,那么什么是“行终止序列”啦?它由那两个字符组成啦?

其中一个字符是回车符(CR),ASCII码十进制为13,另一个字符是换行符(LF),ASCII码为10。那么其实“行终止序列”我们也叫做CRLF。

主体或实体,是一个可选的数据块,与起始行和首部不同的是,主体中可以包含文本或二进制数据,也可以为空。

注意,首部与实体之间有一个空行。


起始行拥有:方法,请求的URL,版本,状态码,原因短语

首部:每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CRLF。注意一点:首部是有一个空行(CRLF)结束的,表示了首部列表的结束和实体主体部分的开始。

实体的主体部分包含一个由任意数据组成的数据块,并不是所有的报文都包含实体的主体部分。


起始行:

请求报文的起始行(请求行)说明了要做些什么,响应报文的起始行(响应行)说明发生了什么。

请求行包含了一个方法和一个请求URL,这个方法描述了服务器应该执行的操作,请求URL描述了要对哪个资源执行这个方法。请求行中还包含HTTP的版本,用来告知服务器,客户端使用的是哪种HTTP。所有的这些字段都是由空格符分隔的。响应行包含了响应报文使用的HTTP版本,数字状态码,以及描述操作状态的文本形式的原因短语。这些字段也是由空格符进行分隔的。

状态码:

200-299之间的状态码表示成功,300-399之间的状态码表示资源已经被移走了,400-499之间的状态码表示客户端的请求出错了,500-599之间的状态码表示服务器出错了。

当前的HTTP版本只为每类状态定义了几个代码。随着协议的发展,HTTP规范中会正式地定义更多的状态码。


首部(相当重要):

HTTP首部字段向请求和响应报文中添加了一些附加信息。其实就是一些键/值对的列表。

HTTP规范定义了几种首部字段,应用程序也可以随意发明自己所用的首部字段。

首部分类:1.通用首部 2.请求首部 3.响应首部 4.实体首部 5.扩展首部

通用首部:既可以出现在请求报文中,也可以出现在响应报文中

请求首部:提供更多有关请求的信息

响应首部:提供更多有关响应的信息

实体首部:描述主体的长度和内容,或者资源自身

扩展首部:规范中没有定义的新首部


首部延续行:

将长的首部行分为多行可以提高可读性,多出来的每行前面至少要有一个空格或制表符.



实体的主体部分:

实体的主体就是HTTP报文的负荷。就是HTTP要传输的内容。HTTP报文可以承载很多类型的数字数据:图片,视频,HTML文档,软件应用程序,信用卡事务,电子邮件等。


起始行(请求行)的方法

安全方法:

HTTP定义了一组被称为安全方法的方法,GET和HEAD方法都被认为是安全的,这就意味着使用GET或HEAD方法的HTTP请求都不会产生什么动作。

不产生动作,在这里意味着HTTP请求不会再服务器上产生什么结果。

GET:通常用于请求服务器发送某个资源。


HEAD:与GET方法的行为很类似,但服务器在响应中只返回首部,不会返回实体的主体部分。这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查。

1.使用HEAD,可以在不获取资源的情况下了解资源的情况(比如,判断其类型)

2.通过查看响应中的状态码,看看某个对象是否存在

3.通过查看首部,测试资源是否被修改了


PUT:与GET从服务器读取文档相反,PUT方法会向服务器写入文档。


PUT方法的语义就是让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档,或者如果那个URL存在的话,就用这个主体来代替它。

POST方法:

POST方法起初是用来向服务器输入数据的。实际上,通常会用它来支持HTML的表单。表单中填好的数据通常会被送给服务器,然后由服务器将其发送到它要去的地方。

TRACE方法:

客服端发起一个请求时,这个请求可能要穿过防火墙,代理,网关或其他一些应用程序。每个中间节点都可能会修改原始的HTTP请求。TRACE方法允许客户端在最终将请求发送给服务器时,看看它变成了什么样子。

OPTIONS方法:

OPTIONS方法请求Web服务器告知其支持的各种功能。可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法。这为客户端应用程序提供了一种手段,使其不用实际访问那些资源就能判定访问各种资源的最优方式。

DELETE方法:

顾名思义,DELETE方法所做的事情就是请服务器删除请求URL所指定的资源。但是,客户端应用程序无法保证删除操作一定会被执行。因为HTTP规范允许服务器在不通知客户端的情况下撤销请求。


除了以上的方法,还支持扩展方法,比如LOCL,MKCOL,COPY,MOVE


状态码:

状态码为客户端提供了一种理解事务处理结果的便捷方式。

100-199 : 信息性状态码

HTTP/1.1向协议中引入了信息性状态码。

100 Continue状态码尤其让人糊涂。它的目的是对这样的情况进行优化:HTTP客户端应用程序有一个实体的主体部分要发送给服务器,但希望在发送之前查看一下服务器是否会接受这个实体。如果客户端在向服务器发送一个实体,并且愿意在发送实体之前等待100 Continue响应,那么,客户端就要发送一个携带了值为100 Continue的Expect请求首部。如果客户端没有发送实体,就不应该发送100 Continue Expect首部,因为这样会使服务器误以为客户端要发送一个实体。从很多方面来看,100 Continue都是一种优化。客户端应用程序只有避免向服务器发送一个服务器无法处理或使用的大实体时,才应该使用100 Continue。

200-299: 成功状态码

客户端发起请求时,这些请求通常都是成功的。服务器有一组用来表示成功的状态码,分别对应于不同类型的请求。

300-399:重定向状态码

重定向状态码要么告知客户端使用替代位置来访问他们所感兴趣的资源,要么就提供一个替代的响应而不是资源的内容。如果资源已被移动,可发送一个重定向状态码和一个可选的Location首部来告知客户端资源已被移走,以及现在可以在哪里找到它。这样,浏览器就可以在不打扰使用者的情况下,透明地转入新的位置了。

400-499: 客户端错误状态码

有时客户端会发送一些服务器无法处理的东西,比如格式错误的请求报文,或者最常见的,请求一个不存在的URL。

500-599: 服务器错误状态码

有时客户端发送了一条有效请求,服务器自身却出错了。这可能是客户端碰上了服务器的缺陷,或者服务器上的子元素,比如某个网关资源出错了。


首部:




0 0