HTTP消息是服务器和客户端之间交换数据的方式。有两种类型的消息︰
- 请求(requests):由客户端发送用来触发一个服务器上的动作
- 响应(responses):来自服务器的应答。
- 起始行:用于描述要执行的请求,或者是对应的响应状态。这个起始行总是单行的。
- HTTP头部:一个可选的HTTP头集合指明请求或描述消息正文
- 空行:指示所有关于请求的元数据已经发送完毕。
- 正文:包含请求相关数据 (比如HTML表单内容), 或者响应相关的文档。 正文的大小有起始行的HTTP头来指定。
基于ABNF的HTTP协议格式:HTTP头部和正文是可选的(optional)。
起始行和HTTP头部统称为请求头部(the head of the requests)。
1. HTTP请求
1.1 起始行
request-line
=
methodSP
request-targetSP
HTTP-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-versionSP
status-codeSP
reason-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 组成,每部分包含不同的信息段。但这是比较少见的。