1. HTTP协议简介
HTTP是一种通信协议,指架构在TCP/IP之上应用层的一种协议。
2. HTTP特性
它有两个基本但又极为重要的特性:
HTTP是一种基于请求/响应的通信协议,客户端对服务器发出一个取得资源的请求,服务器将要求的资源响应给客户端,每次的联机只做一次请求/响应。在HTTP协议之下,服务器响应客户端之后,就不会记得客户端的信息,更不会维护与客户端有关的状态。
浏览器在使用HTTP发出请求时,有几种请求方式,如:GET、POST、HEAD、PUT、DELETE等,绝大数情况下只会使用GET和POST方法。
二、请求信息
1. 请求信息组成
请求信息 = 请求行 + 请求头 + 请求体(只有post请求才会存在请求体信息)
2. 请求行
请求行 = 请求方式 + 请求的资源 + http协议的版本
3. 请求头
Host: localhost:9090 (服务器的域名)Connection: keep-alive (网络连接是持久的)Content-Length: 12 (发送数据的大小, 单位字节)Cache-Control: max-age=0 (设置缓存数据的存活时间, 单位秒)Origin: http://localhost:9090 (指示了请求来自于哪个站点——服务器名称)Upgrade-Insecure-Requests: 1 (如果存在更安全的响应,客户端优先选择加密及带有身份验证的响应)Content-Type: application/x-www-form-urlencoded (发送数据的媒体类型 — 发挥作用类似后缀名:.mp3 .avi)User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 (当前客户使用的浏览器版本)Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Referer: http://localhost:9090/day01/1.html(代表了来哪个页面)Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9Cookie: JSESSIONID=98006861B5044ACC8D5C7840C93C17DA4. 请求体
只有Post请求有
1. 响应信息组成
响应信息 = 状态行(响应行)+ 响应头 + 响应体
2. 响应行
响应行 = 协议版本 + 状态码,例:HTTP/1.1 200
常见的响应状态码
状态码的作用:代表了本次的请求服务器的响应状态(本次的请求是否成功)
3. 响应头
响应头的数据是响应给浏览器,可以设置响应头的数据,让浏览器按照我们指定的设置进行执行响应的功能。
常见响应头介绍:
四、GET请求
Get请求,顾名思义,就是向服务器取得的指定的资源。在发出Get请求时,必须一并告诉服务器所请求资源的URL、请求参数和标头信息等。URL的编码格式采用的是ASCII编码,而不是UNICODE,即是说所有的非ASCII字符都要编码之后再传输。一个Get请求的发送格式如下:
<HTTP方法:GET><请求的URL><请求参数><HTTP版本>
<请求标头>
请求参数通常是用户发送给服务器的必要信息,请求参数是在URL之后跟一个问号?,然后是请求参数名(name)和请求参数值(value),中间以等号(=)表示成对关系,若有多个请求参数,则以&字符连接。使用Get方式发送请求,浏览器的地址栏上会出现请求参数信息。
http://localhost:8080/test/login?username=abc&password=123456五、Post请求
Post请求,顾名思义,就是在请求时发布信息给服务器,对于大量或复杂的信息发送(如:文件上传),基本都会采用Post方法。一个Post请求的发送格式如下:
<HTTP方法:POST><请求的URL><HTTP版本>
<请求标头>
<请求参数>
表面上看,Post只是将请求参数移至最后的信息体(Message Body)中,由于信息体的内容长度不受浏览器限制,所以大量数据的发送会使用Post方法,而且移至信息体后URL上不会出现请求参数。
六、选用 Get请求 or Post请求
从功能上:
Get请求的请求参数会出现在地址栏上,敏感性或有安全性考虑的请求参数(如:信用卡卡号、用户名、密码等),就不应该使用GET请求发送;
Get请求可以发送的请求参数长度有限(这个长度根据浏览器种类和版本而有所不同),对于数据量太大的数据并不适合用GET方式来请求;
Post请求的请求参数不会出现在地址栏上,所以无法加入浏览器的书签(Bookmark)之中,如果有些页面是根据请求参数来作不同的画面呈现(如:论坛的文章发表),而你希望可以让用户设定书签,则应该使用GET请求。
POST和GET方式的安全性是相对的,另外也要看是从哪个角度来看。从数据传输过程方面来看,POST方式是更加安全的,但是从对服务器数据的操作来看,POST方式的安全性又是比较低的。即使是传输过程用POST来执行,安全性也是相对的,如果了解HTTP协议漏洞,通过拦截发送的数据包,同样可以修改交互数据,所以这里的安全不是绝对的。
从非功能性上:
Get请求应该用于等幂操作。Get请求纯粹取得资源,而不改变服务器上的数据或者状态。Get的请求参数,只是用来告知服务器,必须进一步根据请求参数(而不是url)来标识出要响应的内容(如查询数据库数据),同样的Get请求使用相同的参数使用多次,都应该传回相同的结果;
Post请求应该用于非等幂操作。Post请求发送的数据,可能会影响服务器上的数据或状态,例如修改(增、删)数据库的内容,或是在服务器上保存文件,你的请求若会改变服务器的状态,则应该使用Post请求。
是否为等幂操作,就是请求的操作是否改变服务器的状态,即同一个操作重复多次,是否传回同样的结果。
七、Get请求 和 Post请求 的区别
面试回答:
GET在浏览器回退时是无害的,而POST会再次提交请求;GET产生的URL地址可以被Bookmark,而POST不可以;GET请求会被浏览器主动cache,而POST不会,除非手动设置;GET请求只能进行url编码,而POST支持多种编码方式;GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留;GET请求在URL中传送的参数是有长度限制的,而POST么有;对参数的数据类型,GET只接受ASCII字符,而POST没有限制;GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。GET和POST两种基本请求方法的区别
八、默认请求方式
一般在浏览器输入一个网址直接访问网站,默认都是GET请求。而在<form>表单中,默认也是GET提交方式,但可以通过设置method属性指定提交方式为GET或者POST。在解决请求信息乱码时,GET请求无需处理,只有POST请求才存在乱码,通过过滤器设置POST请求解决项目请求乱码问题。
if("post".equalsIgnoreCase(method)){ request.setCharacterEncoding("UTF-8"); }免责声明:文章源自网络,版权归原作者所有,如有侵犯联系删除。