Skip to main content

5. Request (请求)

从客户端到服务器的请求消息在该消息的第一行中包括要应用于资源的方法、资源的标识符以及正在使用的协议版本。

Request       = Request-Line              ; Section 5.1
*(( general-header ; Section 4.5
| request-header ; Section 5.3
| entity-header ) CRLF) ; Section 7.1
CRLF
[ message-body ] ; Section 4.3

5.1 Request-Line (请求行)

Request-Line 以方法标记 (method token) 开始,后跟 Request-URI 和协议版本,并以 CRLF 结束。元素由 SP 字符分隔。除了最终的 CRLF 序列外,不允许 CR 或 LF。

Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

5.1.1 Method (方法)

Method 标记指示要在由 Request-URI 标识的资源上执行的方法。方法区分大小写。

Method         = "OPTIONS"                ; Section 9.2
| "GET" ; Section 9.3
| "HEAD" ; Section 9.4
| "POST" ; Section 9.5
| "PUT" ; Section 9.6
| "DELETE" ; Section 9.7
| "TRACE" ; Section 9.8
| "CONNECT" ; Section 9.9
| extension-method
extension-method = token

资源允许的方法列表可以在 Allow 头字段中指定(第 14.7 节)。响应的返回代码始终通知客户端资源上当前是否允许某个方法,因为允许的方法集可以动态更改。如果源服务器知道该方法但不允许对请求的资源使用该方法,则源服务器应该 (SHOULD) 返回状态码 405(Method Not Allowed);如果源服务器无法识别该方法或未实现该方法,则应返回 501(Not Implemented)。所有通用服务器必须 (MUST) 支持 GET 和 HEAD 方法。所有其他方法都是可选的 (OPTIONAL);但是,如果实现了上述方法,它们必须 (MUST) 以第 9 节中指定的相同语义实现。

5.1.2 Request-URI (请求URI)

Request-URI 是统一资源标识符 (Uniform Resource Identifier)(第 3.2 节),标识要应用请求的资源。

Request-URI    = "*" | absoluteURI | abs_path | authority

Request-URI 的四个选项取决于请求的性质。星号 "*" 表示请求不适用于特定资源,而是适用于服务器本身,并且仅在使用的方法不一定适用于资源时才允许。一个例子是:

OPTIONS * HTTP/1.1

当请求发送到代理时使用 absoluteURI 形式。代理被要求转发请求或从有效的缓存提供服务,并返回响应。请注意,代理可以 (MAY) 在将请求转发到下一个入站服务器之前将请求转发到另一个代理或直接到 absoluteURI 指定的服务器。为了避免请求循环,代理必须 (MUST) 能够识别它的所有服务器名称,包括任何别名、本地变体和数字 IP 地址。示例请求是:

GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

为了允许过渡到 absoluteURI 在所有请求中的使用(将来的 HTTP 版本),所有 HTTP/1.1 服务器必须 (MUST) 接受请求中的 absoluteURI 形式,即使 HTTP/1.1 客户端仅在向代理发出请求时才会生成它们。

authority 形式仅由 CONNECT 方法使用(第 9.9 节)。

最常见的 Request-URI 形式用于标识源服务器或网关上的资源。在这种情况下,URI 的绝对路径必须 (MUST) 作为 Request-URI 传输,网络位置必须 (MUST) 在 Host 头字段中传输。例如,客户端希望直接从源服务器检索资源,将创建到主机 "www.w3.org" 端口 80 的 TCP 连接并发送以下行:

GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.w3.org

后跟请求的其余部分。请注意,如果没有提供端口号,则假定 HTTP 的默认端口为 80。

如果代理接收到这样的请求,它必须 (MUST) 在转发请求之前将 Host 头字段附加到请求,除非它已经存在。(有关 Host 的更多详细信息,请参见第 14.23 节。)

如果 Request-URI 以斜杠开头,则它被视为 abs_path。接收方必须 (MUST) 将空 abs_path 解释为 absoluteURI 的 abs_path 将是 "/"。

所有 HTTP/1.1 客户端在生成 HTTP/1.1 请求消息时必须 (MUST) 包含 Host 头字段。如果 HTTP/1.1 请求缺少 Host 头字段,服务器必须 (MUST) 以 400(Bad Request)响应该请求。

有关代理要求的更多详细信息,请参见第 5.2 节。

5.2 The Resource Identified by a Request (请求标识的资源)

HTTP 源服务器通常在某个命名空间中组织其资源。Request-URI 标识该命名空间内的资源。在 Internet 上,HTTP 源服务器通常可通过 Internet 主机访问,并且(当与 HTTP 一起使用时)被标识为绝对 URI,使用 "http" 或 "https" 方案。源服务器可以 (MAY) 支持一个或多个命名空间,并且(当与 HTTP 一起使用时)可能同时支持一个或多个方案的 URI。

考虑以下 Request-Line:

GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

Request-URI 标识资源为:

http://www.w3.org/pub/WWW/TheProject.html

如果此请求直接到达源服务器 www.w3.org,则服务器应该 (SHOULD) 对位于该服务器上的 "/pub/WWW/TheProject.html" 路径的资源进行操作。

如果此请求到达代理,Request-URI 指定源服务器并且代理应该 (SHOULD) 联系该服务器(可能使用其自己的缓存,如第 13 节所述)。注意,客户端在请求中提供的 URI 与服务器内部用于标识资源的 URI 可能不同。

互联网上源服务器使用的确切资源标识方法不在本规范的范围内。本规范不限制 HTTP 的实现,要求实现使用基于目录的文件系统来满足请求。只有 HTTP 使用的 URI 用于标识给定资源的请求。

5.3 Request Header Fields (请求头字段)

请求头字段允许客户端向服务器传递关于请求以及关于客户端本身的附加信息。这些字段充当请求修饰符,其语义等同于编程语言方法调用的参数。

request-header = Accept                   ; Section 14.1
| Accept-Charset ; Section 14.2
| Accept-Encoding ; Section 14.3
| Accept-Language ; Section 14.4
| Authorization ; Section 14.8
| Expect ; Section 14.20
| From ; Section 14.22
| Host ; Section 14.23
| If-Match ; Section 14.24
| If-Modified-Since ; Section 14.25
| If-None-Match ; Section 14.26
| If-Range ; Section 14.27
| If-Unmodified-Since ; Section 14.28
| Max-Forwards ; Section 14.31
| Proxy-Authorization ; Section 14.34
| Range ; Section 14.35
| Referer ; Section 14.36
| TE ; Section 14.39
| User-Agent ; Section 14.43

请求头字段名称只能通过更改协议版本来可靠地扩展。但是,可以在不更改协议版本的情况下为字段值赋予新的或实验性的头字段。无法识别的头字段应该 (SHOULD) 被接收方视为实体头字段。