我们先来具体列举他们之间的区别:
- GET请求在URL中传送的参数是有长度限制的,而POST没有。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
- GET请求只能进行url编码,而POST支持多种编码方式。
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET产生一个TCP数据包;POST产生两个TCP数据包。
- GET 幂等;POST 不幂等
- GET 可缓存;POST 不可缓存
GET:
语义是请求获取指定的资源。
GET方法是幂等、可缓存的(除非有 Cache-Control
Header的约束),GET方法的报文主体没有任何语义。
GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连
GET可提交的数据量就跟URL所能达到的最大长度有直接关系。HTTP协议对URL长度是没有限制的,限制URL长度大多数是浏览器或者服务器的配置参数。
GET是通过URL方式请求,参数可以直接看到,明文传输。
应用场景:比如查看前20条微博
POST:
语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。
POST不幂等,(大部分实现)不可缓存。
POST把提交的数据放置在 HTTP 消息主体中。
HTTP协议没有对POST提交的数据量进行任何限制,一般是受服务器配置限制或者内存大小。
POST可以开发者工具或者抓包可以看到,同样也是明文的。
应用场景:比如发微博
注意问题:
幂等性:
HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。
GET方法用于获取资源,不应有副作用,所以是幂等的。比如:GET http://www.bank.com/account/123456,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的副作用,而不是每次GET的结果相同。GET http://www.news.com/latest-news这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足幂等性的。
POST所对应的URL并非创建的资源本身,而是资源的接收者。比如:POST http://www.forum.com/articles的语义是在http://www.forum.com/articles下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URL;所以,POST方法不具备幂等性。
数据包的不同
简单的说:GET产生一个TCP数据包;POST产生两个TCP数据包。也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
但也要分环境:
在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
且并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。