(一)HTTP请求的组成
http请求由如下三部分组成:
1.请求行
2.HTTP header
3.HTTP body
一个典型的请求行比如:
GET www.cnblogs.com HTTP/1.1
请求行写法是固定的,由三部分组成,第一部分是请求方法,第二部分是请求网址,第三部分是HTTP版本。
第二部分HTTP header 在HTTP请求可以是3种HTTP头:1.请求头(request header) 2.普通头(general header) 3.实体头(entity header)
通常来说,由于Get请求往往不包含内容实体,因此也不会有实体头。
HTTP头按照其不同的作用,可以分为四大类。
通用头(General header)
通用头即可以包含在HTTP请求中,也可以包含在HTTP响应中。通用头的作用是描述HTTP协议本身。比如描述HTTP是否持久连接的Connection头,HTTP发送日期的Date头,描述HTTP所在TCP连接时间的Keep-Alive头,用于缓存控制的Cache-Control头等。
实体头(Entity header)
实体头是那些描述HTTP信息的头。它出现在HTTP POST方法的请求中,比如Content-Type和Content-length都是描述实体的类型和大小的头都属于实体头。其它还有用于描述实体的Content-Language,Content-MD5,Content-Encoding以及控制实体缓存的Expires和Last-Modifies头等。
请求头(HTTP Request Header)---cookie在这一部分中
请求头是那些由客户端发往服务端以便帮助服务端更好的满足客户端请求的头。请求头只能出现在HTTP请求中。比如告诉服务器只接收某种响应内容的Accept头,发送Cookies的Cookie头,显示请求主机域的HOST头,用于缓存的If-Match,If-Match-Since,If-None-Match头,用于只取HTTP响应信息中部分信息的Range头,用于附属HTML相关请求引用的Referer头等。
第三部分内容只在POST请求中存在,因为GET请求并不包含任何实体。
(二)HTTP请求的类型---get 和post请求如何传参
虽然我们所常见的只有Get和Post方法,但实际上HTTP请求方法还有很多,比如: PUT方法,DELETE方法,HEAD方法,CONNECT方法,TRACE方法。这
Get和Post最大的区别就是Post有上面所说的第三部分:HTTP BODY 内容。而Get不存在这个内容。因此就像Get和Post其名称所示那样,Get用于从服务器上取内容,虽然可以通过QueryString向服务器发信息,但这违背了Get的本意,QueryString中的信息在HTTP看来仅仅是获取所取得内容的一个参数而已。而Post是由客户端向服务器端发送内容的方式。因此具有请求的第三部分:内容。
有两个位置或者说两种方式可以为request提供参数:request-line方式与request-body方式。
request-line方式是指在请求行上通过URI直接提供参数。get请求正是通过这种方式传递参数
而post请求通过request body 传递参数
(三)HTTP响应
HTTP响应也包括下面三个内容:
1.状态行
2.HTTP头
3.返回内容
其中:HTTP响应中包含的头包括1.响应头(response header) 2.普通头(general header) 3.实体头(entity header)。
通用头(General header)
通用头即可以包含在HTTP请求中,也可以包含在HTTP响应中。通用头的作用是描述HTTP协议本身。比如描述HTTP是否持久连接的Connection头,HTTP发送日期的Date头,描述HTTP所在TCP连接时间的Keep-Alive头,用于缓存控制的Cache-Control头等。
实体头(Entity header)
实体头是那些描述HTTP信息的头。既可以出现在HTTP POST方法的请求中,也可以出现在HTTP响应中。比如图5和图6中的Content-Type和Content-length都是描述实体的类型和大小的头都属于实体头。其它还有用于描述实体的Content-Language,Content-MD5,Content-Encoding以及控制实体缓存的Expires和Last-Modifies头等。
响应头(HTTP Response Header)
HTTP响应头是那些描述HTTP响应本身的头,这里面并不包含描述HTTP响应中第三部分也就是HTTP信息的头(这部分由实体头负责)。比如说定时刷新的Refresh头,当遇到503错误时自动重试的Retry-After头,显示服务器信息的Server头,设置COOKIE的Set-Cookie头,告诉客户端可以部分请求的Accept-Ranges头等。
(四)HTTP协议的状态保持
还有一点值得注意的是,HTTP协议是无状态的,这意味着对于接收HTTP请求的服务器来说,并不知道每一次请求来自同一个客户端还是不同客户端,每一次请求对于服务器来说都是一样的。因此需要一些额外的手段来使得服务器在接收某个请求时知道这个请求来自于某个客户端。如图8所示。
图8.服务器并不知道请求1和请求2来自同一个客户端
通过Cookies保持状态
为了解决这个问题,HTTP协议通过Cookies来保持状态,对于图8中的请求,如果使用Cookies进行状态控制,则变成了如图9所示。
图9.通过Cookies,服务器就可以清楚的知道请求2和请求1来自同一个客户端
(五)下面通过一个例子,http协议中get与post方法header和body的不同。
(一)POST请求:http://localhost:9080/daydayup/to.jspA:http请求header:
POST /daydayup/to.jsp HTTP/1.1-----------请求行
Host: localhost:9080 -----通用头
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8----请求头
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:9080/daydayup/from.jsp
Cookie: JSESSIONID=0000-Ubag-0HtbyayXaZZqC5H0-:-1
Content-Type: application/x-www-form-urlencoded-----实体头
Content-Length: 18
username=454545454---body?
B: http响应header
HTTP/1.x 200 OK
Content-Type: text/html; charset=ISO-8859-1
Content-Language: zh-CN
Content-Length: 1099
Date: Wed, 25 Nov 2009 01:50:31 GMT
Server: WebSphere Application Server/6.1
(二)GET请求:http://localhost:9080/daydayup/to.jsp?username=454545454
A:http请求header:
GET /daydayup/to.jsp?username=454545454 HTTP/1.1------请求行(传递的参数在次)
Host: localhost:9080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:9080/daydayup/from.jsp
Cookie: JSESSIONID=0000-Ubag-0HtbyayXaZZqC5H0-:-1
B:http响应header:
HTTP/1.x 200 OK
Content-Type: text/html; charset=ISO-8859-1
Content-Language: zh-CN
Content-Length: 978
Date: Wed, 25 Nov 2009 01:51:35 GMT
Server: WebSphere Application Server/6.1