get与post的区别
相同点
get和post是HTTP协议中的两种发送请求的方法,底层都是用TCP/IP协议进行通信的。
get和post本质上都是TCP链接, 之所以有get和post区分,是因为需要通过HTTP的规则,对浏览器/服务器的限制进行区分,使他们在应用过程中体现出不同。
区别
-
最直观的区别就是GET把参数包含在URL中,POST通过body传递参数。
url中传输参数有长度限制,一般为2kb
post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
-
最重点的区别是:GET产生一个TCP数据包,POST产生两个TCP数据包。
也就是说,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器第一次先将header发送过去,服务器若响应100 continue,确认服务器和网络没问题可以服务,才会再将真正的data数据提交,服务器响应200 ok。
-
安全性不同
get安全性比较低。post安全性较高。
这是因为,get将参数直接暴露在URL上
-
实际使用时
get:只为获取数据,同时加上请求参数的url不会特别大,且没有需要保密的字段,则用get请求;
post:为了提交数据,比如提交一些数据给后台保存、删除等,无论是否有一定数据量均可使用post;另外,使用post提交请求来get数据也是可以的。
而响应回来的数据就靠服务器的处理
其他区别
- GET请求在浏览器刷新或者回退的时候是无害的。POST的话数据会被重新提交。
- GET可以被书签收藏,POST不行
- GET可以存在缓存中。POST不行
- GET 会将数据存在浏览器的历史中,POST不会
- GET 编码格式只能用ASCII码,POST没有限制
- GET 数据类型urlencode,POST是URLENCODE,form-data
- 可见性 参数在URL用户可以看见,POST的参数在REQUSET BODY中不会被用户看见
涉及到的知识块
浏览器
-
get是会缓存的,post是不会缓存的
get重复提交服务器是不会继续响应的,post是每一次提交就会响应一次
-
浏览器直接发出的GET只能由一个url触发。
但是HTTP协议本身并没有这个限制。并不是GET只能用url
-
浏览器的POST请求都来自表单提交。
每次提交,表单的数据被浏览器用编码到HTTP请求的body里。
浏览器发出的POST请求的body主要有有两种格式:
-
application/x-www-form-urlencoded用来传输简单的数据,大概就是"key1=value1&key2=value2"这样的格式。
-
传文件,会采用multipart/form-data格式。
采用后者是因为application/x-www-form-urlencoded的编码方式对于文件这种二进制的数据非常低效。
只不过表单里面的那些用input 等标签经过用户操作产生的数据都在会在body里。
-
接口使用(如ajax访问后端)
-
当用HTTP实现接口发送请求时,就没有浏览器中那么多限制了,只要是符合HTTP格式的就可以发。
就是响应报文与请求报文的格式
参数可以随意放:url上、header上、body上
只要能和服务器约定好就行
不过这些就有些规范,开发人员是按照一些风格做的,能做到更好的协和工作。
最大名气的规范:REST
-
GET也可以实现不缓存,浏览器缓存
get一般用query参数,可以看到参数名、参数值
post一般用params参数,只可以看到参数名
-
POST作为接口的形式使用时:
浏览器是重复请求的,但可以在服务器做判断,如果是重复请求就不给数据
-
只要某个要开发的资源/api的URL长度有可能达到2000个bytes以上,就必须使用body来传输数据,除非有特殊情况。
Chrome的rul限制长度是2kb
HTTP协议本身对URL长度并没有做任何规定。
理解
-
TCP:
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
TCP旨在适应支持多网络应用的分层协议层次结构。
连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。
-
对于get方式,服务器端用Request.QueryString获取变量的值。
-
对于post方式,服务器端用Request.Form获取提交的数据。
-
没有副作用被称为:幂等“(Idempotent)”
-
RPC协议:
是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。
传输层:就是要不要同源协议这些
应用层:就是应用
问题
-
post的query参数会显示在路径上吗?
-
get的必须是query参数吗?
不是
-
post的必须是params参数吗?