GET 和 POST 的区别

176 阅读2分钟

基本理解

GET:我(客户端)这次来 是跟你(服务端)要东西(数据)的;
POST:我(客户端)这次来是给你(服务端)送东西(数据)的;

  • GET“读取“一个资源。比如Get到一个html文件。反复读取不应该对访问的数据有副作用。比如GET一下,用户就下单了,返回订单已受理“,这是不可接受的。没有副作用被称为“幂等“(Idempotent)。因为GET因为是读取,就可以对GET请求的数据做缓存。这个缓存可以做到浏览器本身上(彻底避免浏览器发请求),也可以做到代理上(如nginx),或者做到server端(用Etag,至少可以减少带宽消耗)
  • POST在页面里<form> 标签会定义一个表单。点击其中的submit元素会发出一个POST请求让服务器做一件事。这件事往往是有副作用的,不幂等的。不幂等也就意味着不能随意多次执行。因此也就不能缓存。比如通过POST下一个单,服务器创建了新的订单,然后返回订单成功的界面。这个页面不能被缓存。试想一下,如果POST请求被浏览器缓存了,那么下单请求就可以不向服务器发请求,而直接返回本地缓存的“下单成功界面”,却又没有真的在服务器下单。那是一件多么滑稽的事情。因为POST可能有副作用,所以浏览器实现为不能把POST请求保存为书签。

常见误区

1、get在地址栏传输数据,post在表单传输数据
这是浏览器的做法,不能代表协议;再者说,JS中就可以使用Ajax来发送GETPOST等各种请求,难道JS代码中也有地址栏吗?难道不用HTML表单就无法发送POST请求吗?

2、get传输数据量小,post传输数据量大
GET传输数据量小是浏览器在实现HTTP协议时做的限制,协议中并没有对方法传输数据大小做规定,理论上来说传输的数据量都是无限大小的,但是工具的实现需要契合语义,所以大部分工具,都对get请求做了限制;

3、get传输数据可见,因此不安全;post传输数据不可见,因此安全
HTTP协议中,对所有数据的请求及相应,都是明文传输的,没有任何加密方式,也就是说安全与不安全不是用哪种方法能够改变的,HTTP协议本身就是不安全,在HTTP协议基础上加入加密解密的功能才是安全问题的解决办法,这就是HTTPS出现的原因