HTTP最早被用来做浏览器与服务器之间交互html和表单的通讯协议;后来又被被广泛的扩充到接口格式的定义上。所以在讨论get和post区别的时候,需要现确定下到底是浏览器使用的get/post还是用http作为接口传输协议的场景。
这里特指浏览器中非Ajax的http请求,即从html和浏览器诞生就一直使用的http协议中的get/post。浏览器用GET请求来获取一个html页面/图片/css/js等资源;用post来提交一个<form>表单,并得到一个结果的网页。
“读取“一个资源。比如get到一个html文件。反复读取不应该对访问的数据有副作用。比如”get一下,用户就下单了,返回订单已受理“,这是不可接受的。这里get没有副作用被称为“幂等“(Idempotent)。
get因为是读取,就可以对get请求的数据做缓存。这个缓存可以做到浏览器本身上(彻底避免浏览器发请求),也可以做到代理上(如nginx),或者做到server端(协商缓存,用Etag,至少可以减少带宽消耗)
在页面里<form> 标签会定义一个表单。点击其中的submit元素会发出一个POST请求让服务器做一件事。这件事往往是有副作用的,不是幂等的。
不幂等也就意味着不能随意多次执行。因此也就不能缓存。比如通过POST下一个单,服务器创建了新的订单,然后返回订单成功的界面。这个页面不能被缓存。试想一下,如果POST请求被浏览器缓存了,那么下单请求就可以不向服务器发请求,而直接返回本地缓存的“下单成功界面”,却又没有真的在服务器下单。那是一件多么滑稽的事情。
当然,服务器的开发者完全可以把GET实现为有副作用;把POST实现为没有副作用。只不过这和浏览器的预期不符。
GET产生一个TCP数据包,POST产生两个TCP数据包
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
原文:
https://www.zhihu.com/question/28586791
原文:https://www.cnblogs.com/xjy20170907/p/12586504.html