在我们使用ajax进行前后台交互的时候,肯定会接触到请求方式这个问题,而其中我们最常用的就是get和post。但是这两者之间到底有什么区别呢?
说起get和post的区别,大部分人都知道一些,get用来请求数据而post用来提交数据 ,传值的方式不一样,安全性不一样等等。但是,这是为什么呢?
数据包的不同
从最底层的来说,ajax发送请求,依靠的是http协议和tcp/id协议的包装。
从发送的数据包来看,get和post请求的一点不同在于get是发送一个请求包,而post则是发送两个请求包。
get发送一个请求,好比我直接拿着东西去给了你。
post呢?先发送一个请求头,得到允许的回应之后,再把请求体传输过去。好比我先打好招呼,“你在家吗,我要给你一个东西,是什么样的东西,什么类型的,多大的…,你准备好接收了吗?”。当服务器回应说:“我准备好了,你发过来吧”,然后我再把数据发送过去。从时间上来说他要慢好多。
所以想要效率快一点的获取数据,一般是使用get。而传输数据量比较大的,保密性要求高的,一般使用post提交。
参数位置的不同
然后呢,请求的参数所在的位置不同,也产生的很多的区别。
首先来说,get请求参数是放在请求头,和请求地址拼装在一起发送过去。所以它是一种显性的传参,参数摆在明面上大家都可以看到。
所以,get请求是不安全的,别人可以看到你传的是什么内容。并且,摆在明面上,导致会被浏览器记录下来,会被保留,会被缓存。
还有一点就是请求头,或者说拼接的地址他是有长度限制的,浏览器不会允许你传无休止长度的请求地址。这是浏览器的一个限制而不是协议的限制,不同的浏览器有不同的限制。长度一般会被限制在2kb左右,所以一般来说长度是足够使用的。
post请求呢,参数是放在请求体里边的,包装在我的请求里边,就像放在口袋里,别人看不到传的什么参数,所以它是安全的,不会被记录。而且理论上来说数据长度可以达到80到100kb。
我在一篇帖子上看到过一个形象的比较,说是把get比作货车,post比作汽车。货车运货,东西是放在车顶上的,所有人都能看到是什么货。(ps:用东西蒙起来,像不像是一种加密呢?)汽车运货,东西是放在车里的,别人看不着这是什么东西。
还有一点就是,没有硬性规定,get传值只能在拼接到地址上,post只能在请求体里去传。着应该只是一种约定俗成的东西吧。get你可以放到请求体里啊,post也可以拼接在请求头啊。就像货车可以在车厢里放东西,汽车也可以把东西放车顶上。只是有些浏览可能会不支持这样做,毕竟这样代码风格很跳脱的人很少的。