HTTP 报文
报文流
HTTP 报文是在 HTTP 应用程序之间发送的由文本形式的元信息 (meta-information)和可选的数据的数据块。
HTTP 使用流入 (inbound)和流出 (outbound)来描述事务处理 (transaction)的方向。报文流入源端服务器,工作完成之后,会流回用户的 Agent 代理中。
HTTP 报文会像河水一样流动。不管是请求报文还是响应报文,所有报文都会向下游 (donwstream)流动。所有报文的发送者都在接受者的上游 (upstream)。
报文的组成部分
HTTP 报文是简单的格式化数据块。每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应。它们由三个部分组成:对报文进行描述的起始行 (start line)、包含属性的首部 (header)块,以及可选的、包含数据的主体 (body)部分。
起始行和首部就是由行 (CRLF) 分隔的 ASCII 文本。
实体的主体或者报文的主体是一个可选的数据块。与起始行和首部不同的是,主体可以包含文本或者二进制数据,也可以为空。
请求报文 (request message)
请求报文会向 Web 服务器请求一个动作。
<method> <request-url> <version>
<headers>
<entity-body>
响应报文 (response message)
响应报文会将请求的结果返回给客户端。
<version> <status> <reson-phrase>
<headers>
<entity-body>
- 起始行 (start line)
-
请求行
<method> <request-url> <version>
-
响应行
<version> <status> <reson-phrase>
-
-
方法 (method)
客户端希望服务器对资源执行的动作。
HTTP 定义了一组被称为安全方法的方法。 GET 方法和 HEAD 方法都被认为是安全的,这就意味着使用 GET 或者 HEAD 方法的 HTTP 请求都不会产生什么动作。不产生动作,在这里意味着 HTTP 请求不会在服务器上产生什么结果。
方 法 描 述 是否包含主体 GET 从服务器获取一份稳定 否 HEAD 只从服务获取文档的首部 否 POST 向服务器发送需要处理的数据 是 PUT 将请求的主体部分存储在服务器上 是 TRACE 对可能经过代理服务器传送到服务器上的去的报文进行跟踪 否 OPTIONS 决定可以在服务器上执行哪些方法 否 DELETE 从服务器上删除一份文档 否 -
请求 URL (request-URL)
命名了所请求的资源,或者 URL 路径组件的完整 URL。
-
版本 (version)
报文所使用的 HTTP 版本。
HTTP/<major>.<minor>
其主要版本 (major) 和次要版本 (minor) 都是整数。
-
状态码 (status-code)
整体范围 已定义范围 分类 100 ~ 199 100 ~ 101 信息提示 200 ~ 299 200 ~ 206 成功 300 ~ 399 300 ~ 305 重定向 400 ~ 499 400 ~ 415 客户端错误 500 ~ 599 500 ~ 505 服务器错误 -
原因短语 (reason-phrase)
数字状态码的可读版本,包含行终止序列之前的所有文本。原因短语只对人类有意义。
-
首部 (header)
可以有零个或者多个首部,每个首部都包含一个名字,后面跟着一个冒号 (:),然后是一个可选的空格,接着是一个值,最后是 CRLF。
首部是有一个空行 (CRLF) 结束的,表示了首部列表和实体主体部分的开始。
将长的首部行分为多行可以提高可读性,多出来的每行前至少要有一个空格或者制表符 (tab)。
- 通用首部
- 请求首部
- 响应首部
- 实体首部
- 扩展首部
-
实体的主体部分 (entity-body)
实体的主体部分包含一个由任意数据组成的数据块。
一组 HTTP 首部总是应该以一个空行 (CRLF) 结束,甚至即使没有首部和实体的主体部分也应如此。客户端和服务器也都应该接受那些没有最后那个 CRLF 的报文。