写在前面

get 和 post 都是浏览器通过 HTTP 协议发送请求时,HTTP 定义的请求方法,get 和 post 是常用的两种方法,HTTP 请求方法除了 get 和 post 外,还有 put、delete等等。即在早期的划分中是
增(put) 删(delete) 改(post) 查(get)
那么 get 和 put 方法的区别是什么呢?

1 一般区别

  1. GET 方法是直接将参数挂在 URL 上进行传递,而POST 方法是通过 request body 传递参数,因此,GET 方法是不安全的,POST 方法相比于 GET 方法是更安全的。
  2. GET请求在URL中传送的参数是有长度限制的,一般是1024个字节,而POST传递的参数没有长度限制。
  3. GET 的请求参数是放在 URL 中的,POST 的请求参数是放在消息提里面的。
  4. GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
  5. GET 产生的 URL地址 可以被加入收藏栏,而 POST 不可以。
  6. GET 请求会被浏览器主动缓存,而 POST 不会。
  7. GET 请求只能进行 URL 编码,而 POST 请求支持多种编码
  8. 对于参数的数据类型,GET 方法只接受 ASCII 字符,而 POST 没有限制。
  9. GET 请求的参数会被完整地保留在浏览器的历史记录里,而 POST 请求中的参数不会被保留
  10. GET 因为只需要发送请求头,因此只需要一个请求报文,而 POST 需要发送请求头和请求体,需要两个请求报文
  11. GET 是获取内容,是幂等的,即多次 GET 不会改变数据库,而 POST 是修改内容,是不幂等的,多次 POST 可能会改变数据库。

2 实际区别

实际上,上述列举的 GET 和 POST 的区别并不严谨,POST 也可以将部分参数放到 URL 中,GET 也可以将部分参数放到消息体中,GET 和 POST 实际上的区别如下:

  1. 语义上的区别,GET 是用于获取数据,POST 是用于提交数据
  2. GET 产生一个 TCP 数据包,POST 产生两个 TCP 数据包,因为对于 GET 请求,浏览器会将 HTTP header 和 data 一并发送出去,服务器返回数据响应200。而对于 POST 请求,浏览器会先将 HTTP header 发送出去,浏览器接收后响应 100 continue,然后浏览器再发送 data 数据,服务器返回数据响应200。