在 HTTP 请求中, 最主要和常见的方法就是 Get 请求和 Post 请求.
1. 什么是 Get 请求
Get: 请求指定的页面信息
值得注意的是: Get 方法只是用户获取和查询数据, 并不会对服务器上的数据产生修改, 因此, 从这点可以得知, 它是数据安全的.
2. 什么是 Post 请求
Post: 向指定资源提交数据进行处理请求, 也就是说, 它可以向服务器发送修改请求, 从而修改服务器数据.
3. Get 和 Post 的区别
- Get 请求不允许带请求体, 而 Post 请求允许带请求体
- 从语义上讲: Get 请求属于 Select 方法, 而 Post 请求属于 Insert 方法.
- Get 请求具有幂等性: 针对同一个 URL, 多次发起 Get 请求, 服务器的数据不应该有任何变化; 对于 Post 请求而言, 就可能会修改服务器数据.
- Get 会发送一个 TCP 数据包, 而 Post 会发送两个 TCP 数据包.
注意:
- 实际操作过程中, Get 也可以完成 Post 操作. 即将 Post 请求的请求体放入 Get 的 Query String 中. 但是这样做的缺点是: 由于 Query String 是一种明文, 所以用户在使用 Get 请求时, 就可以看见 Query String 中的内容.
但是 Get 和 Post 都有自己的语义, 所以尽量不要混用. - 关于 Get 发送一个 TCP 数据包和 Post 发送两个 TCP 数据包:
Get 在向服务器发送 HTTP 请求时, 会将 header 信息连同 data 信息一起发送.
Post 在向服务器发送 HTTP 请求时, 会先发送 header 信息, 直到服务器响应回 100 状态码后, 才会继续发送 data 信息.既然 Post 需要两步, 而 Get 只需要一步, 说明 Get 比 Post 更有效, 那么是否可以通过使用 Get 来替换掉 Post 从而优化性能呢?
- Get 和 Post 都有自己的语义, 尽量不要混用
- 如果网络环境好的话, 发一次包的时间和发两次包的时间几乎没有什么差别. 但是如果网络环境差的话, 两次包的 TCP 在验证数据包的完整性上, 有很大的优势
(如何验证数据包的完整性, 服务端接收到 header 的信息后, header 中会有数据的长度和数据大小等信息, 等到服务器再次接收到 data 信息后, 可以将其与 header 信息进行比对, 从而判断是否有丢包或者包损坏的情况) - 并不是所有的浏览器对于 Post 都会发两个数据包. 比如: Firefox 浏览器中, Post 只会发送一次.