目录
1、Http请求协议的格式
2、Http常见请求头
3、Http的get请求
4、Http的post请求
==========================================================================
1、Http请求协议的格式
请求就是客户端发送给服务器的数据! 客户端 ----> 服务器
请求格式:
----------------------------------------------------------------------------------------------
| * 请求首行:请求方法 请求路径 请求协议/版本。例如:GET /hello/index.jsp HTTP/1.1
| * 请求头:请求头就是一些键值,格式为:头:值,例如:Host:localhost
| * 空行:就是一个空行,用来与请求体分隔
| * 请求体:GET方法没有请求体,POST才有请求体,
| - 请求体内容为:参数名=参数值&参数名=参数值,其中参数值为中文,会使用URL编码。
-----------------------------------------------------------------------------------------------
客户端浏览器发送给服务器的内容就这个格式的,如果不是这个格式服务器将无法解读!在HTTP协议中,请求有
很多请求方法,其中最为常用的就是GET和POST。不同的请求方法之间的区别,后面会一点一点的介绍。
2、Http常见请求头
* Host:请求的服务器主机名
* User-Agent:客户端浏览器与操作系统相关信息
* Accept-Encoding:客户端支持的数据压缩格式
* Connection:客户端支持的连接方式
* Cookie:客户端发送给服务器的"小甜点",它服务器寄存在客户端的。如果当前访问的服务器没有在客户端寄存东西,
那么就不会存在它!
* Content-Length:请求体的长度
* Referer:当前发出请求的地址,例如在浏览器地址栏直接访问服务器,那么没有这个请求头。
如果是在www.baidu.com页面上点击链接访问的服务器,那么这个头的值就是www.baidu.com
> 作用1:统计来源
> 作用2:防盗链
* Content-Type:如果是POST请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体
内容使用url编码。
3、Http的get请求
打开IE,在访问hello项目的index.jsp之间打开HttpWatch,并点击“Record”按钮。然后访问index.jsp页面。
查看请求内容如下:
--------------------- 请求信息如下 -----------------------------------------------------------
| GET /hello/index.jsp HTTP/1.1
| Host: localhost
| User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
| 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
| Connection: keep-alive
| Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98[请求头,请求头由key/value组成。]
| [这个位置是空行,虽然没有东西,但很重要。如果有请求体,那么请求体在空行的下面]
--------------------- GET请求没有请求体,结束 -------------------------------------------------
请求信息解释:
* GET /hello/index.jsp HTTP/1.1 --> GET请求,请求服务器路径为/hello/index.jsp,协议为HTTP的1.1版本
* Host:localhost --> 请求的主机名为localhost
* User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0 -->与浏览器和OS
相关的信息。有些网站会显示用户的系统版本和浏览器版本信息,这都是通过获取User-Agent头信息而来的.
* 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, deflat -->支持的压缩格式。数据在网络上传递时,可能服务器会把数据压缩后再发送;
* Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7 --> 客户端支持的编码;
* Connection: keep-alive --> 客户端支持的链接方式,保持一段时间链接,默认为3000ms;因为大型页面上会有
框架页,会触发很多相关的页面请求,图片等资源会单独发请求,所以连接服务器一会儿可保证页面加载成功。
保持连接一会儿,会在连接时间内完成页面内容加载完全。
* Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98 --> 因为不是第一次访问这个地址,所以会在
请求中把上一次服务器响应中发送过来的Cookie在请求中一并发送去过;这个Cookie的名字为JSESSIONID,
以后讲的"会话"是讲它!
4、Http的post请求
为了演示POST请求,我们需要修改index.jsp页面,即添加一个表单:
<form action="" method="post">
关键字:<input type="text" name="username"/>
<input type="password" name="password"/>
<input type="submit" value="提交"/>
</form>
POST请求是有请求体的,而GET请求不能有请求体。
打开HttpWatch,输入hello后点击提交,查看请求内容如下:
--------------------- 请求信息如下 ---------------------------------------------------------
| POST /hello/index.jsp HTTP/1.1 [描述:请求首行]
| Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/msword,
| application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application,
| application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
| Referer: http://localhost:8080/hello/index.jsp
| Accept-Language: zh-cn,en-US;q=0.5
| User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2;
| .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
| Content-Type: application/x-www-form-urlencoded
| Accept-Encoding: gzip, deflate
| Host: localhost:8080
| Content-Length: 13
| Connection: Keep-Alive
| Cache-Control: no-cache
| Cookie: JSESSIONID=E365D980343B9307023A1D271CC48E7D|
| [描述:这是空行。]
| username=zhangsan&password=123 [描述:这是请求体,上面是空行。]
--------------------- POST 请求有请求体-------------------------------------------------
请求信息解释:
Content-Type: application/x-www-form-urlencoded --> 表单的数据类型,说明会使用url格式编码数据;
Content-Length:13 --> 请求体的长度,这里表示13个字节。
username=zhangsan&password=123 --> 请求体内容!username 是表单字段的名字,
zhangsan 是在表单中输入的数据,不同字段的数据用"&"符号连接。
详解Referer:
Referer请求头是比较有用的一个请求头,它可以用来做统计工作,也可以用来做防盗链。
* 统计工作:我公司网站在百度上做了广告,但不知道在百度上做广告对我们网站的访问量是否有影响,
那么可以对每个请求中的Referer进行分析,如果Referer为百度的很多,那么说明用户都是通过百度
找到我们公司网站的。
* 防盗链:我公司网站上有一个下载链接,而其他网站盗链了这个地址,
例如在我网站上的index.html页面中有一个链接,点击即可下载JDK7.0,但有某个人的微博中盗链了
这个资源,它也有一个链接指向我们网站的JDK7.0,也就是说登录它的微博,点击链接就可以从我网站
上下载JDK7.0,这导致我们网站的广告没有看,但下载的却是我网站的资源。这时我们可以使用Referer
进行防盗链,在资源被下载之前,我们对Referer进行判断,如果请求来自本网站,那么允许下载;
如果非本网站,先跳转到本网站看广告,然后再允许下载。