Get 和 Post 两者的区别?
👨🏫 考点:HTTP 协议、TCP/IP 协议
⭐️ 基本点 回答两者区别
两者的区别:
- 语义不一样。Get 表示从服务器获取资源,它是一种幂等操作,而 Post 表示去提交或者更新资源到服务器,它是非幂等的。
- 可见性不一样。Get 的参数在 URL 上,Post 的参数放在 body 中
- 安全性不一样。Get 的参数暴露在 URL 上,相对不安全。
- 缓存不一样。Get 一般会被缓存下来,而 Post 不可以。
- 可传输的数据类型不一样。Get URL 参数只能传输字符串,而 Post 支持多种数据格式的传输。
🌟 加分点 深入底层
Get 和 Post 从底层实现来说,两者都是一样的,都是通过 TCP/IP 协议进行数据的传输,都需要进行握手连接、发送 HTTP 请求、响应 HTTP 数据等。所以如果你在 Get 请求中 把参数放在 body 中也是可以的。区分出 Get 和 Post 请求的好处主要是:
- 语义化。能够进一步的去细化请求的类型。让服务器知道一个请求是想要干什么的。
- 针对性优化。服务器和浏览器都针对不同的请求进行优化,比如参数的处理、缓存策略等等。
🌟 加分点 项目经验
在实际开发过程中,遇到过团队统一使用 Post 请求,然后再在 Post 请求中响应一层自定义的 status 和 data。
优点是:
- 灵活性。绕开了 HTTP 请求协议,自定义响应的 status 和 data 可以自由定义,灵活性强。
- 可扩展性。由于 status 和 data 可以自定义,所以可以任意定义数据结构和字段。
- 统一接口风格。只用 Post,接口的风格更加通用,代码的可阅读性和可维护性比较高。
缺点是:
- 复杂性。增加接口的复杂性,相当于定义一套“HTTP 标准”。
- 学习成本。团队需要花费额外的时间去学习这套新标准。
- 兼容性差。新标准和标准 HTTP 协议不一样,所以用一些 HTTP 库的时候可能就无法正确解析。
🌟 加分点 项目经验
之前一位同事在和另外一个项目对接的时候,出现了一个奇怪的 bug,他使用各种方法排查,最后定位到了对方项目自己手动实现了一遍 HTTP 协议,所以有些 Header、Methods 就不一致。这就是一种很现实的兼容性问题。