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)是以一个方法标记开始,后面跟随Request-URI和协议版本,最后以CRLF结束。元素是以SP字符分隔。CR或LF是不被允许的除了最后的CRLF。

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

5.1.1方法 (Method)
 方法标记指示了在被Request-URI指定的资源上执行的方法。这种方法是大小写敏感的。

 Method     = "OPTIONS"                     ;9.2节

             | "GET"                        ;9.3节

             | "HEAD"                       ;9.4节

             |"POST"                        ;9.5节

             |"PUT"                         ;9.6节

             |"DELETE"                      ;9.7节

             |"TRACE"                       ;9.8节

             |"CONNECT"                     ;9.9节

             | extension-method

Extension-method = token

资源允许的方法由Allow头域指定(14.7节)。响应的返回码总是通知客户是否一个方法对一个资源在当前是被允许的,因为被允许的方法集合能被 动态的改变。一个源服务器应该返回405状态码(方法不能允许)如果此方法对于一个请求资源在服务器那里不被允许,并且返回501状态码(没有实现)如果 此方法不被源服务器识别或实现。方法GET和HEAD必须被所有常规目的的服务器支持。所有其它的方法是可选的;然而,如果上面的所有方法都被实现,这些 方法必须遵循的语意和第9节指定的相同。

5.1.2请求URL(Request-URI)
Request-URI是一种全球统一资源标识符(3.2 节),并且它指定请求的资源。

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

Request-URI的OPTIONS依赖于请求的性质。星号"*"意味着请求不能应用于一个特定的资源,但是能应用于服务器,并且只能被允许当使用的方法不能应用于资源的时候。举例如下

             OPTIONS  *  HTTP/1.1

当向代理(proxy)提交请求时,绝对URI(absoluteRUI)是不可缺少的。代理(proxy)可能会被要求再次转寄此请求。注意:代 理可能再次提交此请求到另一个代理或直接给源服务器。为了避免循环请求,代理(proxy)必须能识别所有的服务器名字,包括任何别名,本地变量,数字 IP地址。一个请求行(Request-Line)的例子如下:

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

为了未来HTTP版本的所有请求能迁移到绝对URI(absoluteURI)地址,所有基于HTTP/1.1的服务器必须接受绝对URL地址,即使HTTP/1.1的客户端只向代理产生给绝对URI(absoluteURI)。

authority部分只被用于CONNECT方法(9.9节).

Request-URI大多数情况是被用于指定一个源服务器或网关(gateway)上的资源。这种情况下,URI的绝对路径(abs_path) 必须被用作Request-URI,并且此URI(authority)的网络位置必须在Host头域里指出。例如:客户希望直接从源服务器获取资源,这 种情况下,它可能会建立一个TCP连接,此连接是特定于主机”www.w3.org”的80端口的,这是会发送下面行:

   GET  /pub/WWW/TheProject.html  HTTP/1.1

   Host:www.w3.org

接下来是请求的其他部分,注意绝对路径不能是空的;如果在原始的URI里没有出现绝对路径,必须给出"/"(服务器根目录).

Request-URI是以3.2.1节里指定的格式传输。如果Request-URI用"%HEX HEX"[42]编码,源服务器为了解析请求必须能解码它。服务器接收到一个无效的Request-URI时必须以一个合适的状态码响应。

透明代理(proxy)不能重写接收到的Request-URI里的”abs_path”当它转寄此请求到下一个服务器时,除了根据上面声明的把一个空的abs_path用”/”代替。

注:不重写的规则防止了代理(proxy)改变请求的意思,当源服务器不能正确的利用非保留(non-reserved)的URI字符时 。实现者应该知道某些pre-HTTP/1.1代理(proxy)能重写Request-URI。

5.2请求资源 (The Resource Identified by a Request)
请求里资源的精确定位是由请求里的Request-URI和Host头域决定的。

如果源服务器资源不依赖于请求的Host头域指定的主机(译注:可能会存在虚拟主机),那么它会忽略请求的头域当它决定其资源的时候。(对于一个支持Host的HTTP/1.1服务器,在19.6.1.1节描述了其他的需求).

源服务器如果根据请求里的主机区别资源(这是因为存在虚拟主机和虚拟主机名),它必须遵循下面的规则去决定请求的资源当出现一个HTTP/1.1请求时:

1. 如果Request-URI是绝对地址(absoluteURI),这时请求里的主机存在于Request-URI里。任何出现在请求里Host头域值应当被忽略。

2. 假如Request-URI不是绝对地址(absoluteURI),并且请求包括一个Host头域,则主机由该Host头域值决定.

3. 假如由规则1或规则2定义的主机是一个无效的主机,则应当以一个400(错误请求)错误消息返回。

缺少Host头域的HTTP/1.0请求的接收者可能会推测决定什么样的资源被请求(例如:检查URI的路径对于某个特定的主机是唯一的)。

5.3请求报头域 (Request Header Fields)
请求头域允许客户端传递请求的附加信息和客户端自己的附加信息给服务器。这些头域作为请求的修饰符,这和程序语言方法调用的参数语义是一样的。

   请求头(request-header) = Accept            ;14.1节

                         | Accept-Charset       ;14.2节

                          |Accept-Encoding         ;14.3节

                          |Accept-Language        ;14.4节

                          |Authorization       ;14.8节

                          |Expect                       ;14.20节

                          |From            ;14.22节

                          |Host                ;14.23节

                          |If-Match         ;14.24节

                          |If-Modified-Since       ;14.25节

                          | If-None-Match            ;14.26节

                          | If-Range                 ;14.27节

                          | If-Unmodified-Since   ;14.28节

                          | Max-Forwards        ;14.31节

                          | Proxy-Authorization  ;14.34节

                          | Range            ;14.35节

                         | Referer           ;14.36节

                          |TE                           ;14.39节

                          | User-Agent           ;14.43节

请求头域的名字是能结合于协议版本而能被扩展的。然而新的或实验性的头域应该被给出请求头域的语义如果通信的所有方都把它看作请求头域。不能识别的头域会被看作实体头域(entity-header)。