1.了解HTTP
1.1 HTTP简介
就像两个国家的元首会晤过程得遵守一定外交礼节一样,浏览器与web服务器之间的一问一答的交互过程也得遵守一定的规则,这个规则就是HTTP协议。HTTP协议是 HyperText Transfer Protocol(超文本传输协议)的英文简写,它是TCP/IP协议集中的一个应用层协议,用户定义浏览器与web服务器之间交换数据的过程以及数据本身的格式.HTTP协议在不断的完善和扩展,因此有不同的版本,现在被广泛使用的是 HTTP1.1,相对于HTTP1.0而言,HTTP1.1最大的特点是支持持续连接.
1.2 HTTP1.0与HTTP2.0的比较
HTTP1.0不支持持续连接,每次请求和响应都需要建立一个单独的连接,每次连接只传输一个文档和图像,上一次和下一次请求完全分离.
为了克服HTTP1.0的缺陷,HTTP1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟.
2. HTTP消息的格式
当你在浏览器地址栏键入域名地址然后敲回车时,这时浏览器将会生成请求消息发送给web服务器,服务器收到请求后,将生成响应消息回送给客户端浏览器.浏览器发出的请求消息和web服务器回送的响应消息都叫HTTP消息,HTTP消息有一定严格规定的格式. 浏览器提交给web服务器的form表单内容和从web服务器上获取的网页内容仅仅是HTTP消息的一部分数据,浏览器与web服务器传递的信息还包含一般用户所看不到的一些其他"隐藏"的信息.
一个完整的请求消息包括:一个请求行,若干消息头,以及请求体.下面是HTTP请求消息的内容:
上面请求消息的第一行为请求行,请求行后面的部分都属于请求头部分.虽然该请求消息中没有请求体,但进阶着消息头部分之后是一个空行(只有回车和换行符的行)必不可少,这个空行用于表示消息头部分已经结束. 当用户在地址栏直接访问一个URL地址或单击网页上一个超链接时,浏览器将使用GET方式发送类似上面不包含实体内容的请求消息;只有使用POST,PUT和DELETE方式的请求消息才可以包含请求体.比如提交form表单时
一个完整的响应消息包括:一个状态行,若干消息头,以及响应体.下面是HTTP响应消息的内容:
上面的响应消息中第一行为状态行,紧跟状态行后面的部分是消息头部分,接着是一个空行,然后是响应体(这里只显示了头两行).在通常情况下响应消息都包含响应体,响应体就是网页的内容.
2.1 HTTP消息头
HTTP请求和HTTP响应都使用消息头来描述 HTTP消息本身的信息,这种描述信息的信息称为元信息. 使用消息头,可以实现HTTP客户端与服务器之间的条件请求和应答. 消息头相当于与服务器和浏览器之间的一些暗号指令,服务器可以使用消息头来通知浏览器采取一些特殊动作.例如:隔多久刷新网页,用哪种字符编码解释网页内容等等;浏览器也可以使用消息头告诉服务器一些信息,例如:当前请求是通过哪个网页上的超链接引导进来的,浏览器的国家语言版本等等.
消息头部分是由一系列的行组成,每行都包含一个头字段名称,然后依次是冒号,空格,值,回车换行. 消息头字段是不区分大消息的,但习惯上将每个单词的首字母大写,整个消息头部分中的格个消息头可按任何顺序排列.
按照其作用分类,消息头又可分为通用信息头,请求头,响应头,实体头四类.
- 通用信息头: 既能用于请求消息中,也能用户响应消息中,但与被传输的实体内容没有关系的常用消息头.
- 请求头:用于在请求消息中向服务器传递附加信息.
- 响应头:用于响应信息中向客户端传递附加信息.
- 实体头:用作实体内容的元信息,描述了实体内容的属性,包括实体信息的类型,长度,压缩方法等
请求消息头可以包括通用信息头,请求头和实体头; 响应消息中可以包括通用信息头,响应头和实体头; 某些头字段既能用于请求头也可以用于响应头.
2.2 请求行与状态行
2.2.1 请求行
请求消息的请求行包括三个部分:请求方式,资源路径,以及所使用的HTTP协议版本,各个部分用空格分隔,语法格式为:
请求方式 资源路径 HTTP版本号
2.2.2 状态行
响应消息的状态行中包括三个部分:HTTP协议的版本号,一个表示成功或错误的整数代码(状态码)和对状态码进行描述的文本信息,各部分用空格分隔,语法格式为:
HTTP版本号 状态码 原因描述
2.3 使用Get和POST方式传递参数:
2.3.1 GET方式
当用户在浏览器地址栏中直接访问某个URL地址或单击网页上一个超链接时,浏览器将使用GET方式发送请求.如果网页form表单的method属性设置为"GET"或者没有设置method属性的,浏览器默认使用GET方式提交数据.
在URL地址后面可以附加一些参数,每个参数由参数名和参数值组成,参数名和参数值之间用 等号(=)分隔,各个参数之间用&符分隔,URL地址与整个参数部分之间用问好(?)分隔,如下所示:
http://localhost:8080/Demo1/servletA?id=1&name=123&pwd=123
注意:当使用GET方式提交表单时,浏览器各个表单字段元素以及数据按照URL参数的格式附加在请求行的资源路径后面.使用GET方式传输数据量是有限制的,一般限制在1kb下.
2.3.2 POST方式
如果网页上的form元素的method属性设置为"POST",当用户提交表单请求时,浏览器将使用POST方式提交表单内容,并把各表单字段元素以及数据作为HTTP消息的请求体,发送给web客户端,而不是作为URL地址的参数传递.因此POST方式传输的数据量要比GET方式大的多.
2.4 响应状态码
响应状态码用于表示服务器对请求的各种不同处理结果和状态,它是一个三位的十进制数.响应状态码可归为5中类别,使用最高为1到5来进行分类,如下所示:
- 100~199
- 表示成功接受请求,要求客户端继续提交下一次请求才能完成整个处理过程.
- 200~299
- 表示成功接受请求并已完成整个处理过程.
- 300~399
- 为完成请求,客户端需一步进行细化请求.例如:请求资源已移动到一个新位置
- 400~499
- 客户端请求有错误.
- 500~599
- 服务端出现错误
2.5 HTTP消息头详解
2.5.1 通用信息头
通用信息头既能用于请求消息,也能用于响应消息,它包括一些与被传输的实体内容没有关系的常用信息头段.
2.5.1.1 Cache-Control
如果Cache-Control头字段用在客户机发出的请求消息中,它用于通知位于客户机和服务器之间的代理服务器如何使用已缓存的页面.这种情况下此头的取值为:no-cache,no-store,max-age,max-fresh,min-fresh,no-transform,only-if-cached等.
如果Cache-Control头字段用在响应消息中,它用于通知客户机和代理服务器如何缓存该页面,在这种情况此头取值为:public,private,no-cache,no-store,no-transform,must-revalidate,proxy-revalidate,max-age,s-maxage等.
在一个Cache-Control头字段中可以设置多个值,例如:
Cache-Control:no-store,no-cache,must-revalidate
2.5.1.2 Connection
Connection头字段用于指定处理完本次请求/响应后,客户端与服务器是否还要继续保持连接.
当Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次请求结果后继续保持连接;当Connection请求头的值为close时,客户端与服务器返回本次结果 后关闭连接. HTTP1.1默认采用持久连接,在客户端发出请求消息中没有指定Connection头字段时,等效于Connection请求头的值为Keep-Alive的情况.
2.5.1.3 Date
Date头字段用于表示HTTP消息产生的当前时间.服务器回送正常响应消息中,应该总是设置Date头字段.如果客户端发送的请求消息包含请求体是也应该设置此头字段.
2.5.1.4 Pragma
Pragma头字段的设置值只能固定为:no-cache,即 Pragma:no-cache.
当Pragma头字段用于响应消息时, 指示HTTP1.0客户机不要缓存文档.
当Pragma头字段用于请求消息时,指示代理 服务器必须返回一个最新的文档,而不能使用缓存的文档.
2.5.1.5 Trailer
一些头字段可以放置在HTTP消息的尾部,也就是可以在实体部分内容部分之后出现.对于放置在尾部的头字段,需要在消息头中使用此头字段说明,例如:
Trailer: Date
2.5.1.6 Transfer-Encoding
如果HTTP消息的请求体部分采用某种传输编码方式,使用此头字段指定该编码方式,目前设置值只有:chunked,用于把整个消息体分成一连串分段后进行传输.
2.5.1.7 Upgrade
此头字段允许客户机指定它所支持并希望将当前协议切换到通信协议.
2.5.1.8 Via
此头字段用于指定HTTP消息所途径的中介代理服务器名称和所使用的协议,这个头字段由代理服务器产生,每个代理服务器把他的信息追加到Via字段的最后,以映射HTTP消息途径的多个代理服务器的顺序.
2.5.1.9 Warning
Warning头字段主要用于说明其他头字段和状态码不能说明的一些附加警告信息,例如:返回的实体信息可能已过期.
2.5.2 请求头
请求头字段用于客户端在请求消息中向服务器传递附加信息,主要包括客户端可以接受的数据类型,压缩方法,语言以及发出请求的超链接所属页面的URL地址信息等.
2.5.2.1 Accept
此头字段用于支出客户端程序(通常是浏览器)能够处理的MIME(Multipurpose Intent Mail Extension,多用途Intent 邮件扩展)类型.例如:
Accept:text/html; image/*
2.5.2.2 Accept-Encoding
此头字段用于指定客户机能够进行解码的数据编码方式,这里的编码方式通常是指某种压缩方式.例如:
Accept-Enoding:gzip,compress
2.5.2.3 Accept-Language
此头字段用于指定客户机期望服务器 返回哪个国家语言的文档,可以指定多个逗号分隔的国家语言.例如:
Accept-Language:en-gb,zh-cn
2.5.2.4 Authorization
当客户端访问受口令保护的网页文件时,web服务器会发送401响应状态码和WWW-Authorization响应头,要求客户机使用Authorization请求头来应答.
2.5.2.5 Expect
此头字段用于指定客户机请求服务器采取的特殊行动,目前设置值只有100-continue,用于询问服务器是否可以在后面 的请求中发送一个附加文档.
2.5.2.6 From
此头字段用于指定发送者的Email地址,它只被一些特殊的web客户端程序使用,浏览器不会使用到它.
2.5.2.7 Host
此头字段用户指定资源所在的主机和端口号,格式与资源的完整URL中的主机名和端口号一样,例如:
Host:www.baidu.com
2.5.2.8 If-Match
2.5.2.9 If-Modified-Since
2.5.2.10 If-None-Match
If-None-Match头字段的作用与If-Match头字段的作用正好相反,详细请看If-Match介绍
2.5.2.11 If-Range
If-Range头字段只能伴随着Range头字段一起使用,其设置值可以是实体标签或HTTP的GMT格式的时间,如果设置值为实体标签,且该标签内容与服务器端的代表当前页面内容特征的实体标签相同,则服务器按Range头的要求返回网页部分内容,否则,服务器返回当前网页的所有内容.
2.5.2.12 If-Unmodified-Since
2.5.2.13 Max-Forwards
2.5.2.14 proxy-Authorization
2.5.2.15 Range
此头字段用于指定服务器只需要返回文档的部分内容及内容范围,这对比较大的文档的断点续传比较有用.
2.5.2.16 Referer
表示跳转到此页面的前一个的URL.
2.5.2.17 TE
2.5.2.18 User-Agent
此头字段用于指定浏览器或其他客户端程序的类型和名称,以便服务器针对不同类型的浏览器额返回不同的内容.
2.5.3 响应头
响应头字段用于服务器在响应消息中向客户端传递附加信息,包括服务程序名,被请求资源需要的认证方式,被请求资源以移动到新地址信息等.
2.5.3.1 Accept-Range
此头字段用于说明当前web服务器是否接受Range请求和Range请求中指定的数据单位.如果想告诉客户机不要使用Range请求头,则应使用下面的头信息:
Accept-Range: none
如果服务器想告诉客户机可以使用Range头字段并且以byte为数据单位,则应使用如下头信息:
Accept-Range: bytes
2.5.3.2 Age
此头字段用于指出当前网页文档可以在客户机或代理服务器中缓存的有效时间,设置的值是一个以毫秒为单位的时间数.例如:
Age:5257839257
2.5.3.3 Etag
此头字段用于向客户机传送代表实体内容特征的标记信息,这些标记信息称为实体标签,用于比较在不同的时间获得的统一资源路径下的实体内容是否相等.
2.5.3.4 Location
此头字段用于通知客户机应该到哪个新的地址去获取文档. 状态码为:300~399的响应消息都应该使用Location头字段将新的文档地址告诉给客户机,以便客户机自动重新连接到新地址并检索新文档
2.5.3.5 Proxy-Anthenticate
2.5.3.6 Retry-After
此头字段用于告诉客户机可以在什么时间发出刚才的请求,需要与503结合使用.
2.5.3.7 Server
Server头字段用于指定服务器软件的产品名称,例如:
Server: Microsoft -IIS /5.0
2.5.3.8 Vary
Vary头字段用于指定影响了服务器所生成的响应内容的那些请求头字段名,例如:
Vary:Accept-Language
2.5.4 实体头
实体头是实体内容的元信息,描述实体内容的属性,包括实体信息类型,长度,压缩方法,最后一次修改时间,数据有效期等
2.5.4.1 Allow
此头字段用于指定客户端请求资源所支持的请求方法(如GET,POST等),它通常伴随着405响应状态码一起使用.
2.5.4.2 Content-Encoding
此头字段用于指定实体内容的压缩编码方式. Content-Type响应头字段中指定的MiMe类型是指定实体内容压缩编码前的类型;
2.5.4.3 Content-Language
此头字段用于指定返回网页文档的国家语言类型.
2.5.4.4 Content-Length
此头字段用于表示实体内容的长度,浏览器与web服务器之间使用持久的HTTP连接时,这个头字段在非chunked传输编码的响应消息中是必不可少的.
2.5.4.5 Content-Location
此头字段用于指定响应消息锁封装的实体内容的实际位置路径.
2.5.4.6 Content-MD5
2.5.4.7 Content-Range
此头字段用于指定服务器返回部分实体内容的位置信息.
2.5.4.8 Content-type
2.5.4.9 Expires
此头字段用于指定当前文档应该在什么时候被认为过期. 例如:
Expires: 0
2.5.4.10 Last-Modified
此头字段用于指定文档的最后修改时间.
2.5.5 扩展头
2.5.5.1 Refresh
此头字段用于告诉浏览器过多少秒后自动刷新页面,例如:
Refresh: 3 //过三秒刷新页面
Refresh: 3;www.baidu.com //过三秒跳转到百度首页
2.5.5.2 Content-Disposition