公司人都去外面旅游了,本人由于太懒不想动,就只好在家,把之前学的web知识捡起来,由于之前没开始写博客,现在希望把javaweb知识以博客的形式展现出来,也当做是自己复习的机会,今天就讲下http协议,那么第一个问题来了什么是http协议。
一:什么是http协议
对浏览器客户端和服务器端之间数据传输的格式规范,因为我们软件现在都是基于B/S开发的,就是所谓的浏览器/服务器,它是一种数据传输的格式规范,也就是我服务器给的数据,浏览器能看懂且解析显示给用户看,就像我们在地址栏上输入http://www.baidu.com你所看到的网页一样,所谓规范就是二端约定的东西,就像你和后台调接口一样,什么字段表示什么意思.
二:http协议底层使用了什么?
我们知道http协议它是应用层上的协议,因为应用层上的协议关注的是数据格式是否正确,而底层是用了tcp/ip协议,它关心的是数据传输是否成功了,因为tcp/ip协议有一个三次握手,
三:写例子来实际看看http请求有哪些内容都代表什么意思?
我们知道写服务端和javase之前写的桌面程序是不一样的,之前写的Javase程序 然后你run as一样虚拟机就把你写的东西可以在控制台上可以看到,而现在是服务器端程序,你肯定不能这么干了,在这说明下,在你这使用的服务器端的服务器就是tomcat,不要问我为什么使用tomcat,我不会告诉你我没钱,只能用免费的,如果不知道什么是tomcat的话可以去百度下,我有时间会写一篇关于这方面的博客,在这就不细讲了,
现在写了一个常用的用户注册界面,然后教给servlet去处理,你也不要担心servlet是啥东西,后期会讲到,今天说了只关心http协议就够了,
[html] view plain copy
1. <form action="/httpDemo/servlet/RegisterServlet" >
2. <input type="text" name="user"><br/>
3. <input type="password" name="text"><br/>
4. <input type="submit" value="sumbit">
5. </form>
还有就是请求头和响应头分别是如图:
请求头:
响应头:
这些都是请求和响应的一部分并不是全部,比如cookie,因为我们这次请求并没有使用到,后面的会话管理会讲cookie和session突然发现火狐浏览器这个不是太好,因为它这个请求给的格式不好我继续往下面讲,改用360浏览器吧,发现360浏览器也是这样子,就这样讲吧,按到底是这样的如图:
这是我自己在word上写的 ,这个才很好讲,从中我们可以看出一个http请求包含四部分
a:请求行
b:请求头
c:一个空行
d:请求实体 请求实体为什么说是可选的,因为get请求是没有请求实体的,只有post请求有请求实体,这个很好验证,刚才我的1.html
<form action="/httpDemo/servlet/RegisterServlet" >
name:<input type="text" name="user"><br/>
password: <input type="password" name="text"><br/>
<input type="submit" value="sumbit">
</form>
表单中没有写method这个属性,所以它默认就是get请求,现在我们来看看当点击submit后地址栏会有什么变化,
地址栏请求前:
我填写了用户名和密码后点击sumbit后变化:
认真看下地址栏发生了什么,是不是多了这个字符串?username=123&password=zsc,说明get请求是把参数携带在url后面,这样肯定是不对的,谁那么菜做登录或者注册用get请求,万一你在网吧登录别人在后面把你密码记住了,这不是完蛋,在这就是演示下请求实体内容get是没有这东西的,这个时候再看它的请求头就知道了 如图:
现在把表单请求改为post请求看下:
这是Google浏览器打印出来的,我记得我刚学web开发好像不是这么的,现在分开写了,完整的post请求头是这样的
POST /httpDemo/1.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
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
Referer: http://localhost:8080/httpDemo/1.html
Connection: keep-alive
username=eric&password=123456
这个才是完整的http请求头,这是post请求才有请求实体:我们看到请求头是这样的Host:localhost:8080是不是有点像我们map集合key_value形式,其实是差不多的,我们获取只要获取对应的name就能获取到对应的value值
上面说到get和post请求,在这对这二个请求方式做一个总结
get和post请求区别
1):get请求地址栏(URI)会跟上参数数据。以?开头,多个参数之间以&分割。
post参数不会跟着URI后面。参数而是跟在请求的实体内容中。没有?开头,多个参数之间以&分
2):GET提交参数数据有限制,不超过1KB。
提交的参数数据没有限制
3):GET方式不适合提交敏感密码(因为它会把请求参数直接放在地址栏上)而POST方式提交敏感数据
4):浏览器直接访问的请求,默认提交方式是GET方式
现在一步步来讲一个请求包含请求头 请求行 空行 请求实体(post)请求才有,现在讲下
请求行
POST /httpDemo/1.html HTTP/1.1 这是我们的请求头:
1):Post表示请求方式
2):HTTP/1.1表示请求的http协议版本号
3):/httpDemo/1.html 表示请求的统一资源定位符,它是省略了http://localhost:8080这个,这个叫URL,表示互联网上一个网址,而http://localhost:8080是http(协议)+localhost(域名或者ip也就是公司在运营商那里注册的ip,你才可以访问到你的服务器)+8080找到你8080端口对应的是哪个地址,因为一台服务器可能会有多个应用,我们知道自己本金的静态ip是127.0.0.1那么为什么不写这个ip还要写localhost呢?在你C盘的目录:C:\Windows\System32\drivers\etc有个host文件 你打开这个host文件会看到这个127.0.0.1 localhost 这就是一个ip对应一个域名这二个就是同一个意思,为什么我们写localhost一样能访问,就是这个原因,还有一个叫URI 这个是统一资源标记符。/httpDemo/1.html。用于标记任何源以是本地文件系统,局域网的资源(//192.168.14.10/myweb/index.html)可以是互联网
URL是URI的子类
请求头:
下面列举的是常见的请求头
Accept: text/html,image/* -- 浏览器接受的数据类型
Accept-Charset: ISO-8859-1 -- 浏览器接受的编码格式
Accept-Encoding: gzip,compress --浏览器接受的数据压缩格式
Accept-Language: en-us,zh- --浏览器接受的语言
Host: www.baidu.com:80 --(必须的)当前请求访问的目标地址(主机:端口)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --浏览器最后的缓存时间
Referer: http://www.baidu.com/index.jsp -- 当前请求来自于哪里
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) --浏览器类型
Cookie:name=eric -- 浏览器保存的cookie信息
Connection: close/Keep-Alive -- 浏览器跟服务器连接状态。close: 连接关闭 keep-alive:保存连接。
Date: Tue, 11 Jul 2000 18:23:51 GMT -- 请求发出的时间