几个疑问?
要知道get和post的区别,首先要知道get和post是什么?
get和post是http协议的两种请求方式
那么http又是什么呢?
http是基于TCP/IP协议,数据能在万维网中通信的一种协议
也就是说http的底层是TCP/IP,那么get和post的底层也就是TCP/IP,也就是说get和post都是TCP链接。
举个例子:运送货物时,TCP相当于车辆,如果没有交通规则的话,就会乱套,http就是交通规则,http规定了运输方式有:get,post,put,head,options等等,当进行get请求时,车上贴上get标签,货物放在上层运输,当进行post请求时,车上贴上post标签,货物放在下层运输,当然get请求时货物也可以放在下层运输,可见http只是一个行为准则,如何实现还是要看TCP。
区别
产生数据包
get产生一个TCP数据包,post产生两个TCP数据包
对于get方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
对于post方式的请求,浏览器先发送header,服务器响应100 continue ,浏览器再发送data,服务器响应200 ok(返回数据)
请求参数的限制
get请求的参数只能是ASCII码,所以中文需要URL编码,而post请求传参没有这个限制;
传递参数
get请求通过拼接url进行传递参数
post请求通过body体传递参数
url可见性
get请求参数url可见
post请求参数url不可见
是否可以缓存
get请求是可以缓存的
post请求不可以缓存
传输的数据量
get请求一般传输的数据量较小,大小不超过2k-4k,根据浏览器的不同,限制也有所不同,但是差别不大
post请求一般传输的数据量较大,根据配置文件php.ini的大小来规定,可以无限大
安全性
get请求的数据直接拼接在url后可以看见,不安全
post请求的数据放在body里不可见,相对比较安全
其实,无论是get还是post安全性都不是很高,防不住有人会抓包,这只是一种相对的概念,直观看起来可能觉得post会比较安全。
回退页面的反应
get请求回退,不会对当前页面产生任何影响
post请求回退,会再一次提交请求
小贴士
如果真的要说区别的话,上面列举的就可以了,但实际上他们俩的实现都是基于TCP/IP协议。上面的区别只是浏览器厂家根据约定做的一些限制,他们俩是http请求一开始设定的八种方法里其中的两个,这八种方法本质上无任何区别,只是让请求更加有语义而已。
八种方法:
OPTIONS 返回服务器所支持的请求方法
GET 向服务器获取指定资源
HEAD 与GET一致,只不过响应体不返回,只返回响应头
POST 向服务器提交数据,数据放在请求体里
PUT 与POST相似,只是具有幂等特性,一般用于更新
DELETE 删除服务器指定资源
TRACE 回显服务器端收到的请求,测试的时候会用到这个
CONNECT 预留,暂时不使用