报文流
http 报文是在 Http 应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文在客户端、服务器和代理之间流动。术语"流入"、“流出”、“上游”及“下游”都是用来描述报文方向的。
http 报文会像河水一样流动,不管是请求报文还是响应报文,所有报文都会向下游流动。所有报文的发送者都在接收者的上游。
报文的组成部分
Http 报文是简单的格式化数据块。每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应。有三部分组成:对报文进行描述的起始行(start line)、包含属性的首部(header)块 以及 可选的 包含数据的 主体(body)部分。
起始行
起始行和首部就是由行分隔的 ASCII 文本,每行都以一个由两个字符组成的行终止序列作为结束。实体的主体或者报文的主体 是 一个可选的数据块,可以包含文本或者二进制,可以为 空。
所有的 HTTP 报文都以一个起始行作为开始,请求报文的起始行说明了要做些什么,响应报文的起始行说明发生了什么。
请求报文的起始行又称之为请求行,包含了一个方法和一个请求的 url,这个方法描述了服务器应该执行的操作,请求url 描述了 要对 哪个资源执行 这个方法。请求行中还包含了 http 的版本,用来告知服务器,客户端使用的是哪种 http。
响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。响应报文的起始行,又称之为响应行,包含了响应报文使用的 http 版本、数字状态码,以及描述操作状态的文本形式的原因短语。
所有的 http 报文都可以分为 两类:请求报文(request message) 和 响应报文(response message)。请求报文会向 web 服务器请求一个动作,响应报文会将请求的结果返回客户端。
请求报文格式:
<method> <request-url> <version> <headers> <entity-body>
响应报文格式:(注意,只有起始行的语法会有所不同)
<version> <status> <reason-phrase><headers> <entity-body>
方法(method)
客户端希望服务器对资源执行的动作。eg: get、head 或者 post。
GET : 从服务器获取一份文档;
HEAD : 只从服务器获取文档的首部;
POST : 向服务器发送需要处理的数据;
PUT : 将请求的主体部分存储在服务器上;
TRACE : 对可能经过代理服务器传送到服务器上去的报文进行追踪;
OPTIONS : 决定可以在服务器上执行哪些方法;
DELETE : 从服务器上删除一份文档;
请求url(request-url)
命名了所请求资源或者url 路径组件的完整 url。
版本(version)
报文所使用的 http 版本,格式 如: HTTP/<major>.<minor>,major 主版本号,minor 次版本号,都为整数。
状态码(status-code)
状态码是在每条响应报文的起始行中返回的,会返回一个数字状态,一般是三位数,这三位数字描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述状态的一般类别(“成功”、“出错”等)。
原因短语(reason-phrase)
原因短语和状态码是成对出现的,是响应起始行中的最后一个组件,为状态码提供了文本形式的解释,即以短语文本描述 数字状态码。
首部(header)
可以有 0个 或者 多个首部,每个首部 都包含一个名字,后面跟着一个冒号(:),然后跟着一个空格,接着跟着一个值 和换行。
实体的主体部分(entity-body)
实体的主体是 http 报文的负荷,就是 http 要传输的内容。实体的主体部分包含一个由任意数据组成的数据块。并不是所有的报文都包含实体的主体部分。