在我们初入 java 编程之路的时候, 面试往往会有一个面试题: get 和 post 的区别是什么? 那么你真的知道他们的区别吗? 接下来抽丝剥茧, 让我们看看 get 和 post 到底什么东西, 首先从本质的角度看 get 和 post 并没有区别, 因为 get 和 post 都是 http 协议做传递数据的方式, 那么 http 又什么由什么编写的呢? 是 tcp/ip 协议, 那么我们是不是就可以理解为 get 和 post 也是这个东西, 答案是是的, get 和 post 就是 tcp 链接, 区别只是传输方式的区别:
首先最直观的区别 get 的参数放在 url 里面而 post 的参数放在 request body 里面, 但是单纯从技术的角度看, get 也可以把参数放在 request body 里面, post 也不是不可以把参数放在 url 里面, 只是这样没有必要, 有点傻; 但是不同的服务器对于带有 request body 的方式处理也不一样, 有的服务器会主动获取这些数据但是有的服务器不会主动获取这些数据的, 所以使用 get 加上 request body 传输数据不一定会被接收到;
第二点就是一个安全问题, 显而易见的一个问题, 在登录的时候, 我们肯定不会使用 get 方式传递你的用户名和密码, 因为会被别有用心的人直接在 url 里面直接获取你的信息, 但是 post 把数据放在 request body 中, 所以安全性对比是不言而喻的;
第三点是速度问题, 我来简单介绍一下使用 get 发送请求的过程, 在其中只会生成一次 tcp 包, 把请求头和数据都发送给服务器, 成功返回 200ok, 但是使用 post 便会生成两次 tcp 包, 先把请求头发送给服务器, 生成一次跟后台做交互, 返回 100 continue, 然后再生成一次, 把数据发给服务器, 做交互成功之后返回 200ok, 也就是说 get 请求是无害的, 但是 post 是有害的, 因为他会再次请求, 在这个过程中对比 get 会比 post 快一点, 所以在项目中有些人就会为了用户需求把所有的可以用 get 的方法都使用 get, 但是在项目经验中, 如果在网络连接良好的情况下, get 和 post 所用的时间差是可以忽略不计的, 但是有一点 post 方式在检验 tcp 包完整性的能力是 get 方式无论如何也赶不上的, 并且并不是所有的浏览器在使用 post 的时候会生成两次 tcp 包, 在我了解中在使用火狐浏览器的时候 post 就只会生成一次 tcp 包, 还有一点就是不管 get 还是 post
第四点就是传输参数的限制, 很明显 url 传输数据, 参数只能是传输文本, 并且大小是有限制的, 但是在 request body 传输就不一样了, 你可以传输任意的参数, 就算是一个文件也是可以的, get 的参数大小限制在现阶段, 并没有一个统一个标准, 不同的浏览器有不同的标准, 但是在 2kb 以内是安全的, 大多数浏览器最大也只会处理 64kb 的参数, 超出部分概不处理, 但是反观 post 在理论上讲是不限制大小的, 但是做过项目的人会知道, 以 web 为例, 在 tomcat 里面也会设置他的大小, 所以不要天正的以为你可以随便搞
第五点, get 请求的参数会被完整的保留在浏览器历史记录里面, 但是 post 是不会保留的
好了, 就整理以上五点吧, 只想起这么多了, 如果哪里不对的, 欢迎大家留言指正.
来源: http://www.bubuko.com/infodetail-2603389.html