作用

GET 主要用来获取服务端的资源,而 POST 主要用来传输实体数据。

请求参数

  • 参数位置:GET 的参数是以查询字符串的形式出现在 URL 中的,而 POST 的参数是存储在请求体中的。

  • 参数的数据类型:因为 URL 编码只支持 ASCII 码,所以 GET 中的参数数据类型只能为 ASCII 字符,如果有中文就必须将中文重新编码后再传输。POST 的参数支持标准字符集,支持多种编码方式。

  • 参数的长度:GET 借助 URL 传递参数,所以参数的长度是有限制的,但是 POST 没有长度限制。

是否改变资源状态

  • GET 请求不会改变服务器上资源的状态。

  • POST 请求包含了用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,服务器的资源状态也因此发生了改变。

对服务器而言,HTTP 请求最好使用只读的请求方式,这样不会改变服务器上资源的状态。

用户信息是否可见

  • GET 请求的参数直接暴露在 URL 上,而 URL 会被浏览器主动缓存并完整保留在历史记录中,所以 GET 对于用户信息来说并不安全,不能用来传递敏感信息。

  • POST 请求中的参数信息存储在请求体中,所以不会被保留,较为安全。

幂等性

幂等指的是对同一个 URL 的多次请求应该返回同样的结果,服务器的资源状态也不会发生变化。

  • GET 请求获取资源是幂等的。

  • POST 请求不是幂等的,因为 POST 请求后会产生新的资源,例如多次发送 POST 请求可能会在数据库中添加多条行记录。

数据包发送

GET 请求:浏览器会一次性把 header 和 data 发送出去,然后等待服务器响应200 OK并返回数据,一共产生 1 个 TCP 数据包。

POST 请求:部分浏览器的 POST 请求会先发送 header,等待服务器响应100 Continue之后再继续发送 data,最后服务器响应200 OK并返回数据,一共产生 2 个 TCP 数据包。但并不是所有的浏览器都这样操作,Firefox 的 POST 请求就只发送一次。

参考

  1. CS-Note
  2. HTTP 中 GET 与 POST 的区别