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协议版本的增加,可能会增加新的东东,但是如果所有通信方都把他看做请求头域,那么其他不能识别的头域将被当
信息头来处理。