一、什么是http协议?
转载:http://blog.csdn.net/daijin888888/article/details/51025634
由w3c制订的一种网络应用层协议,定义了浏览器与web服务器之间通信的过程以及通信时所使用的数据格式。
1)通信的过程
step1,浏览器建立与web服务器之间的连接
step2,浏览器将请求数据打包(生成请求数据包)并发送给web服务器。
step3,web服务器将处理结果打包(生成响应数据包)并发送给浏览器。
step4,web服务器关闭连接。
如果浏览器要再发请求,需要重新建立新的连接。
特点: 一次请求,一次连接。
优点: web服务器可以利用有限的连接为尽可能多的客户端(浏览器)服务。
2)数据格式
a,请求数据包
如:
[plain] view plain copy
- POST /web02/hello HTTP/1.1
- Host: localhost:8080
- User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0.1
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
- Accept-Encoding: gzip, deflate
- Connection: keep-alive
- Referer: http://localhost:8888/web02/hello_form.html
- Content-Type: application/x-www-form-urlencoded
- Content-Length: 16
请求行: 请求方式 请求资源路径 协议类型和版本
消息头:
消息头是一些键值对,一般由w3c定义,浏览器与web服务器之间都可以发送,表示特定的某种含义,比如,浏览器可以发送"user-agent"消息头,告诉web服务器浏览器的类型和版本。
实体内容:
只有当请求方式为post时才有值(请求参数),如果请求方式为get,请求参数会添加到请求资源路径的后面。
b,响应数据包
如:
[plain] view plain copy
- HTTP/1.1 200 OK
- Server: Apache-Coyote/1.1
- Content-Type: text/html;charset=utf-8
- Content-Length: 30
- Date: Thu, 05 Dec 2013 07:16:28 GMT
状态行: 协议类型和版本 状态码 状态描述
b1,什么是状态码
是一个三位数字,由w3c定义,表示服务器处理请求的状态。
b2,常见的状态码
200: 服务器处理请求正常。
404: 服务器依据请求路径找不到对应的资源。
500: 系统错误,服务器端的程序在运行过程当中出错了。
405: 服务器找不到可执行的方法来处理请求。
消息头:
服务器也可以发送一些消息头给浏览器,比如"content-type",告诉浏览器,服务器返回的数据类型和编码格式(字符集)。
实体内容:
程序处理的结果,浏览器会将实体内容中的数据取出来,生成相应的页面。
二、请求方式
1)哪一些情况下,浏览器会发送get请求
a,直接在浏览器地址栏输入某个地址
b,点击链接
c,表单使用默认的提交方式
2)get请求的特点
a,会将请求参数放到请求资源路径的后面,只能提交少量的数据(因为请求行最多只能存放2k左右的数据)。
b,会将请求参数显示在浏览器地址栏,不安全(路由器会记录请求地址)。
3)哪一些情况下,浏览器会发送post请求
设置了表单的method属性值为post
4)post请求的特点
a,会将请求参数放到实体内容里面,能提交大量的数据。
b,不会将请求参数显示在浏览器地址栏,相对安全(浏览器没有加密)。
不管是get还是post,都不会对请求参数加密,所以如果是敏感数据,一般都需要加密处理(https)。
Http协议支持六种请求方法,即:
0,GET
1,HEAD
2,PUT
3,DELETE
4,POST
5,OPTIONS
6.trace
但其实我们大部分情况下只用到了GET和POST。如果想设计一个符合RESTful规范的web应用程序,则这六种方法都会用到。不过即使暂时不想涉及REST,了解这六种方法的本质仍然是很有作用的。大家将会发现,原来web也是很简洁明了的。下面依次说明这六种方法。
0,GET:GET可以说是最常见的了,它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。
1,HEAD:HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。
2,PUT:这个方法比较少见。HTML表单也不支持这个。本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。举个例子:如一个用于提交博文的URL,/addBlog。如果用PUT,则提交的URL会是像这样的”/addBlog/abc123”,其中abc123就是这个博文的地址。而如果用POST,则这个地址会在提交后由服务器告知客户端。目前大部分博客都是这样的。显然,PUT和POST用途是不一样的。具体用哪个还取决于当前的业务场景。
3,DELETE:删除某一个资源。基本上这个也很少见,不过还是有一些地方比如amazon的S3云服务里面就用的这个方法来删除资源。
4,POST:向服务器提交数据。这个方法用途广泛,几乎目前所有的提交操作都是靠这个完成。
5,OPTIONS:这个方法很有趣,但极少使用。它用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。
其实还有一个TRACE方法,不过这个基本上不会用到,这里就不介绍了。