HTTP消息是服务器和客户端之间交换数据的方式。有两种类型的消息︰
- 请求(requests):由客户端发送用来触发一个服务器上的动作
- 响应(responses):来自服务器的应答。

- 起始行:用于描述要执行的请求,或者是对应的响应状态。这个起始行总是单行的。
- HTTP头部:一个可选的HTTP头集合指明请求或描述消息正文
- 空行:指示所有关于请求的元数据已经发送完毕。
- 正文:包含请求相关数据 (比如HTML表单内容), 或者响应相关的文档。 正文的大小有起始行的HTTP头来指定。
基于ABNF的HTTP协议格式:HTTP头部和正文是可选的(optional)。
起始行和HTTP头部统称为请求头部(the head of the requests)。

1. HTTP请求
1.1 起始行
request-line
=methodSPrequest-targetSPHTTP-versionCRLF
| 方法 | 用途 | 
|---|---|
| GET | 请求访问已被 URI识别的资源。指定的资源经服务器端解析后返回响应内容。 使用GET的请求应该只被用于获取数据。如果 请求的资源是文本,那就保持原样返回;如果是像CGI那样的程序,则返回经过执行后的输出结果。 | 
| HEAD | 请求一个与 GET请求的响应相同的响应,但客户端只返回响应头部不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等。 | 
| POST | 用于将实体(如 HTML FORM)提交到指定的资源,通常导致在服务器上的状态变化或副作用. | 
| PUT | 用来传输文件,要求在请求报文的主体中包含文件内容,然后保存到请求 URI指定的位置。鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般 的 Web 网站不使用该方法。若配合 Web 应用程序的验证机制,或架构设计采用REST标准的同类 Web 网站,就可能会开放使用PUT方法。 | 
| DELETE | 删除指定的资源。 HTTP/1.1的DELETE方法本身和PUT方法一样不带验证机制,所以一般的 Web 网站也不使用DELETE方法。当配合 Web 应用程序的验证机制,或遵守REST标准时还是有可能会开放使用的。 | 
| CONNECT | 建立一个到由目标资源标识的服务器的隧道。要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP通信。主要使用SSL和TLS协议把通信内容加密后经网络隧道传输。 | 
| OPTIONS | 用于显示目标资源针对请求 URI指定的资源支持的方法。 | 
| TRACE | 让 Web 服务器端将之前的请求通信环回给客户端的。客户端通过 TRACE方法可以查询发送出去的请求是怎样被加工修改 / 篡改的。 | 
| PATCH | 用于对资源应用部分修改。 | 
用于文档管理的WebDav方法:
[瞎写个]:这里写注释
| 方法 | 用途 | 
|---|---|
| PROPFIND | 从Web资源中检索以 XML格式存储的属性。它也被重载,以允许一个检索远程系统的集合结构(也叫目录层次结构 。) | 
| PROPPATCH | 在单个原子性动作中更改和删除资源的多个属性 | 
| MKCOL | 创建集合或者目录 | 
| COPY | 将资源从一个URI 复 制到另一个URI | 
| MOVE | 将资源从一个URI移动到另一个 URI | 
| LOCK | 锁定一个资源 。WebDAV 支持共享锁和互斥锁 。 | 
| UNLOCK | 解除资源的锁定 | 
- request-target:通常是一个 URL,或者是协议、端口和域名的绝对路径,通常以请求的环境为特征。请求的格式因不同的 HTTP 方法而异。它可以是:
- origin-form =absolute-path ["?" query ]:
 一个绝对路径,末尾跟上一个 '?' 和查询字符串 'query =' 。path 为空时必须有'/'。被GET,POST,HEAD和OPTIONS方法所使用。
POST / HTTP 1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
- absolute-form =absolute-URI:
 一个完整的URL,主要在使用GET方法连接到代理时使用。
GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
- authority-form =authority:
 由域名和可选端口(以':'为前缀)组成的 URL 的 authority component。 仅在使用CONNECT建立 HTTP 隧道时才使用。
CONNECT developer.mozilla.org:80 HTTP/1.1
- asterisk-form = "*":
 不是访问特定资源而是对服务器本身发起请求,可以用一个简单的星号('*') 来代替请求 URI。
 配合OPTIONS方法使用,查询 HTTP 服务器端支持 的 HTTP 方法种类。
OPTIONS * HTTP/1.1
- HTTP-version: 定义了剩余报文的结构,作为对期望的响应版本的指示符。
1.2 HTTP头部
有许多请求头可用,它们可以分为几组:
- 
General headers,例如 Via,适用于整个报文。
- 
Request headers,例如User-Agent,Accept-Type,通过进一步的定义(例如Accept-Language),或者给定上下文(例如Referer),或者进行有条件的限制 (例如If-None) 来修改请求。
- 
Entity headers,例如 Content-Length,适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。
 
1.3 正文
不是所有的请求都有一个 body
- 不需要body的请求:获取资源的请求,GET,HEAD,DELETE和OPTIONS。
- 需要body的请求:将数据发送到服务器以便更新数据的请求,POST请求(包含 HTML 表单数据)。
2. HTTP 响应
2.1 状态行
status-line
=HTTP-versionSPstatus-codeSPreason-phraseCRLF
status-code = 3DlGlT
reason-phrase =HTAB/SP/VCHAR/abs-text)
HTTP 响应的起始行被称作 状态行 (status line),包含以下信息:
- 
HTTP-version:通常为 HTTP/1.1。
- status code:表明请求是成功或失败。
- reason-phase:一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。
2.1 HTTP头部
响应头可以分为几组:
- 
General headers:例如 Via,适用于整个报文。
- 
Response headers:例如 Vary和Accept-Ranges,提供其它不符合状态行的关于服务器的信息。
- 
Entity headers:例如 Content-Length,适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。
 
2.1 正文
不是所有的响应都有 body,具有状态码 (如 201 或 204) 的响应通常不会有 body。
Body 大致可分为三类:
- Single-resource bodies,由已知长度的单个文件组成。该类型 body 由两个 header 定义:Content-Type和Content-Length。
- Single-resource bodies,由未知长度的单个文件组成,通过将 Transfer-Encoding设置为chunked来使用 chunks 编码。
- Multiple-resource bodies,由多部分 body 组成,每部分包含不同的信息段。但这是比较少见的。

