吃透HTTP权威指南 第三章 HTTP报文
**定个小目标,吃透这本书,每天最少一章 CSDN 见**
- 报文流
HTTP报文,用来“包裹”HTTP数据的箱子,
HTTP报文是在HTTP应用之间发送的数据块,是一些以文本形式的数据,描述了传输数据的内容,这些数据在客户端服务器和代理之间流动,简称为报文流。
HTTP用术语流入和流出来描述事务处理的方向,客户端到服务器为流入,服务器到客户端到流出。报文会像水一样向下流动。
客户端—>代理—>服务器—>代理—>客户端 - 报文的组成形式
HTTP报文是一个简单的数据块,每条报文都包含一条来自客户端的求情,或者服务器的响应。HTTP报文包含3个部分,对报文描述的起始行(start line),包含属性的首部块(header),以及可选的包含 数据的主体
起始行和首部都是由行分割的ASCII的文本,每行都以一个由两个字符组成的行终止序列作为结束(“\r\n\r\n”)。这个行终止序列可以写成CRLF。也有一些使用单个换行符(\n)来表示终止。HTTP的主体是和起始行和首部不同,它是一个可选的数据库(可以没有),它可以是二进制数据。首部需要给出主体的格式信息,Content-type: text/plain 行就说明了主体的格式为text,Content-length:19行表示主体的长度。
HTTP的所有报文都可以分为两类,请求报文,响应报文,请求报文会向WEB服务器请求一个动作,响应报文会将请求的结果返回给客户端。请求报文和响应报文的基本报文结构相同。
请求报文的格式:
响应报文的格式,只是起始行语法不同<method> <request-URL> <version> <headers> <entity-body>
<version> <status> <reason-phrase> <headers> <entity-body>
上面短语的注释,
method,HTTP的请求方法往往是一个单独的GET,HEAD,POST…)。 request-URL,上一章有说过。version,HTTP的版本。
status,返回的状态码(执行的结果,成功或者失败等)。
reason-phrase,返回的原因短语。header 首部,可以有多个或者0个首部,没个首部都包含了一个名字,后面用“:”分割其值,有一个空行表示结束。
entity-body,实体部分,可以是任何数据,也可以没有实体
注意:一个HTTP首部应该总是由一个空行结束 - 方法
所有的请求报文都是由一个起始行的,也叫做求情行,包含了一个方法和一个求情URL,用来告知服务器客户端要对那个资源执行什么方法,还由一个HTTP版本,HTTP并没有要求所有的起始行必须包含HTTP版本。
响应行包含了报文使用的HTTP版本,返回的数字状态码,以及用来描述操作状态的文件形式短语
请求的起始行以方法作为开始,方法用来告知服务器要做些说明,比如:"GET /test/aaa.gif HTTP/1.0"中,方法就是GET。
HTTP规范总定义了一组常用的请求方法:
不是所有服务器都实现了上面的所有方法,HTTP设计得易于扩展,所以有些服务器可能实现了一些其他的方法方法 描述 是否包含主体 GET 从服务器获取一份文档 否 HEAD 中从服务器获取文档的首部 否 POST 向服务器发送需要处理的数据 是 PUT 将求情的主体不放呢存储到服务器上 是 TRACE 对可能经过代理服务器传送到服务器的报文进行追踪 否 OPTIONS 决定可以在服务器上执行那些方法 否 DELETE 从服务器上删除一份文档 否
状态码是用来告诉客户端执行的结果或者发送了上面事情。比如 HTTP/1.0 200 OK 状态码就是200.
状态码的分别一般为
整体范围 以定义 分类
100-199 100·101 信息提示
200-299 200-206 表示成功
300-399 300-305 重定向
400-499 400-415 客户端错误
500-599 500-505 服务器出错
HTTP/1.0 200 OK 中OK为返回的短语,HTTP中对短语没有硬性要求。
HTTP版本号是为了以便了解对方的能力个HTTP报文的格式,主要版本号的比较不能用小数形式来进行比较,应该是两个单独的数据进行比较,就是HTTP/2.22就比HTTP/2.3大,因为22比3大。
HTTP起始行后面跟的就是HTTP首部了,HTTP首部是由一个或多个行组成的。HTTP规范定义了几种首部字段。应用程序也可以随意发明自己所用的首部。HTTP首部可以分为以下几类
通用首部:既可以出现在求情报文中,也可以出现在响应报文中
求情首部:提供更多有关请求的信息
响应首部:提供更多有关响应的信息
实体首部:描述实体的长度和内容或者资源自身的信息
扩展首部:规范中没有定义的新首部
每个HTTP首部都有一种简单的语法 “选项: 值” :后面的空格为可选的 最后以CRLF结尾
HTTP首部行可以分为多个行来提高可读性,多出来的行前面只是要由一个空格或制表符(tab)
例如:HTTP/1.0 200 OK Content-Type: image/gif Content-Length" 8672 Server: Test Server Version 1.0 ``` 这个部分中Server中就是被分为多行表示的 HTTP的主体部分为HTTP的实体,就是HTTP要传输的内容,其中可以包含任意格式的内容 HTTP的方法会根据HTTP服务器对方法实现的不同而执行不同的操作,比如,DELETE方法,服务器的实现可能并不是删除,而是资源移动到某个位置。 HTTP定义了一组被称为安全方法的方法,这些方法都不会对服务器产生任何动作(有点像只读)。安全方法并不一定是什么动作都不执行的,是用安全方法的目的就是运行HTTP应用程序开发者通过告知用户这个操作可能引发某些不安全的方法。比如线上支付,很多浏览器都会对其进行提示。 GET:基本上所有服务器都实现了该方法,HTTP/1.1要求服务器实现了此方法。通常用于从服务器获取某个资源 HEAD:和GET方法很类似,但是HEAD方法只返回首部,该首部应该和GET方法获取的首部完全一样。 PUT:与GET方法想法,该方法是将用户数据发送到服务器上去,因此大多服务器允许用户将数据写入到服务器,但大多都需要用户输入密码登录。 POST:起初是用来向服务器输入数据的,实际上通常会用它来支持HTML的表单,用户将表单填好,然后发送给服务器。 TRACE:记录了从客户端到服务器的路径,中间转发的服务器。 OPTIONS:用来查询服务器支持的各种功能 DELETE:用来删除资源文件的,但是HTTP服务器不一定会执行,HTTP规范运行服务器在不通知客户端的情况下撤销求情。 扩展方法:HTTP允许用户自定义扩展方法,其中由一些通用的扩展方法,LOCK(允许用户锁定资源文件)MKCOL(允许用户创建支援)COPY(便于在服务器上负责资源)MOVE(在服务器上移动资源) 并不是所有方法都是规范的,最好对这些扩展方法宽容一些。
- 状态码
HTTP的状态码被分为五大类
100-199 信息性状态码 以定义的
200-199 成功状态码 以定义的
300-399 重定向状态码 以定义的
400-499 客户端错误状态码 以定以的
500-599 服务器错误状态码 以定义的
以上是状态码的表示 - 首部
通用首部:表示客户端和服务器和其他应用程序之间提供的通用功能,比他Date首部就是一个通用首部,每一端都可以用它来说明构建报文的时间
求情首部:请求报文特有的,它为服务器提供了一些额外的信息,比如客户端希望接受说明类型的数据
响应首部:响应报文特有的,以便为客户端提供信息
实体首部:实体首部指的是拥有应对实体主体部分的首部,就是文件的类型,长度
扩展首部:由应用程序开发者创建的,还未添加到已批准的HTTP规范中