X

HTTP/1.1阅读之请求

5.1 请求消息的构成

在上一章,我们知道一个请求的消息应该由以下几部分组成:

 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
他们是请求头(由请求行、一般头、请求头和信息头)+信息主体构成。我们来看看请求行(Request-Line),他是由下面几部分构成的:
Method sp URI sp HTTP-Version CRLF,我们来像教科书一样,看看各个部分都是干啥的

5.1.2 方法(Method)
请求的方法一共有以下几种:
 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
上图的意思是:OPTION是可选的(有那么多种),然后加上Token,我们比较熟悉的是GET、POST、HEAD方法。
源服务器一般将这边能够接受的请求方法写在 Allow header field 这个域中,然后在返回的信息中通知到客户端,因为这些被允许的方法并不是一成不变的。
如果一个方法是在列表,但是又没有允许的情况下,源服务器会返回405错误,如果完全不支持则返回501错误,这以上列表的方法中,GET和HEAD是必须能够支持的。

5.1.2 Request-URI
Request-URI    = "*" | absoluteURI | abs_path | authority 
统一资源定位符,由以上四种形式构成,他会是他们其中的一种,他是用来定位资源的具体位置的。
其中×定位符,表示这个请求并不定位到具体的资源,他在乎的仅仅是服务器本身,但是必须是方法不应用一个资源时。真心不知道他说的啥意思,平时太少见了。
注意的是,使用代理访问的时候,发给代理的请求必须是absoluteURI这种格式的,代理可以根据需要从cache直接返给用户,或者是将请求发给源服务器。需要
注意的是,代理有可能再发给另外一个代理服务器(不是源服务器),或者直接访问源服务器。为了避免代理间的循环请求。例如,有ABC三个代理,A从B拿数据,B
又从C拿数据,C从A拿数据,这就形成了一个循环(我的理解如此),那么为了避免这个问题,代理必须要能识别出服务器的名字,不管你使用的是别名、数字ip还
是别的啥玩意儿,这样,ABC三个人都互相认识,也就不会出现循环了。一个完整的Reques-line如下:
 GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
所有的HTTP/1.1的服务器,必须能够接受和处理absoluteURI地址
authority 这种形式,只能用于CONNECT方法。
对于我们来说,大部分访问是向源服务器或是网管请求的,这时候,Request-URI必须表现成abs_path的形式,而这个时候的网络主机信息就必须以头域里的host轮胎体现了
举例来说,一个访问主机host的请求类似于:
  GET /pub/WWW/TheProject.html HTTP/1.1
       Host: www.w3.org
必须注意的是,第一行abs_path是不能缺少的,如果空的时候,应该写成“/”表示网站的根目录
一个透明代理是不应该更改abs_path的,除非是把空的改写成"/"。
如果是以absoluteURI 的形式来进行请求的,那么头域的host信息会被忽略。如果不是这种形式以外的其他形式,应该以头域的host域为准,如果host无效
会返回400错误。(坏请求)
缺少头域的host的http/1.0的请求,可能会使用启发是规则,就是去看,是不是特定的主机。
5.3 请求头域
请求头域能够让客户端添加附件的信息,来告之服务器。其中信息如下:
       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

这些个东西,是能够被扩展的。随着HTTP协议版本的增加,可能会增加新的东东,但是如果所有通信方都把他看做请求头域,那么其他不能识别的头域将被当
信息头来处理。
龙安_任天兵: 不忘初心,方得始终!