请求协议
请求协议一般是HTTP/1.0,不过近年来开始流行HTTP/1.1。
请求头部
请求头部允许客户端向服务器传递请求的附加信息以及客户端自身的信息。
采用name:value的形式,以行为单位。
常用的请求头部如下:
Accept : 指定客户端接受那些类型的信息。如:Accept:text/html 表示客户端可接受html类型的文本数据。
Accept-Charset:指定客户端接受的字符集,如果没有明确指定,表示任何字符集都可接受。
Accept-Encoding:指定可接受的内容编码。
Accept-Language:指定一种自然语言
Authorization:用于验证客户端有权查看某个资源,当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
下面看一个完整的请求报文。
POST /cgi/cgifun HTTP/1.1
Host: 192.168.3.21:8080
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20131029 Firefox/17.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://192.168.3.21:8080/
Content-Type: application/x-www-form-urlencoded
Content-Length: 65
空行
firstname=Mickey&firstname=Mickey&lastname=Mouse&firstname=Mickey(请求数据/POST的参数)
响应报文
同样响应报文格式和请求报文保持一致,只是内容有些改变。响应报文由响应行,响应头部,空行,响应数据四部分组成。
把请求报文的图照搬下来,名字变一下就是了。
响应报文与请求报文的最大不同点在于第一行,响应行。
响应行
响应行也是由三部分构成,协议版本,响应状态码,响应状态码文本描述。如下面这行数据:
HTTP/1.0 200 ok
响应状态码为200,表示成功响应,文本描述为OK。响应状态码有很多种。
1xx:表示请求已接受,继续处理
2xx:表示请求已被成功接受,理解,接受
3xx:重定向,要完成请求必须更进一步的操作。
4xx:客户端错误,请求有语法错误或请求无法实现。
5xx:服务端错误,服务器未能实现合法的请求。
常见的状态码有:(后面的英文是对应的文本描述)
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
响应头部
响应头部允许服务器传递不能放在状态行中的响应信息,以及关于服务器的信息和对于URL所标识的资源进行下一步访问的信息。
Location:响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时
Server:响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。
WWW-Authenticate:响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
eg:WWW-Authenticate:Basic realm=”Basic Auth Test!” //可以看出服务器对请求资源采用的是基本验证机制。
关于头部部分,除了上述所说的响应头部和请求头部之外还有以下几种常见属性。
普通头部
在普通头部中,有少数报头域用于所有的请求和响应消息,但不用于被传输的实体,只用于传输的消息。
Cache-Control:用于指定缓冲指令。缓存指令是单向的(响应中出现未必请求中也出现),独立的(一个消息中的缓存指令不会影响另一条消息)
请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
Date:普通报头域表示消息产生的日期和时间
Connection:普通报头域允许发送指定连接的选项。例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接
实体头部
请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。
常用的实体报头
Content-Encoding
Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法,eg:Content-Encoding:gzip
Content-Language
Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读
者。eg:Content-Language:da
Content-Length
Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
Content-Type
Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg:
Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312
Last-Modified
Last-Modified实体报头域用于指示资源的最后修改日期和时间。
Expires
Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。eg:为了让浏览器不要缓存页面,我们也可以利用Expires实体报头域,设置为0,jsp中程序如下:response.setDateHeader(“Expires”,”0”);