最近在知乎上看到一个挺有意思的问题:公司规定所有接口都用 POST 请求,为什么?
说实话,我自己对这个问题也蛮有感触。2019 年,我接过一个从零开始搭建的微服务项目,当时第一次系统接触接口设计规范,比如大家耳熟能详的 RESTful 规范,后来也把它用到了那个项目里。
今天再翻到这个问题,有了一些新的理解,顺便回顾一下 get与post的请求的一些区别:
- POST 更安全:不会作为 URL 的一部分,不会被缓存,也不会存进服务器日志和浏览器历史记录。
- POST 发送的数据量更大,因为 GET 有 URL 长度限制。
- POST 能发送更多数据类型,GET 只能发送 ASCII 字符。
- POST 比 GET 慢。
- post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作。
- GET 请求静态资源会命中缓存,请求数据则不会。
从这些区别来看,POST 在大数据量、非 ASCII 内容的场景下优势明显,而 GET 更适合获取静态资源、简单查询这类接口。
我个人的开发习惯是:简单查询用 GET,增、删、改和复杂查询用 POST,但不会像提问者的公司那样全部接口都走 POST。
网友 @程墨Morgan 提出,如果由他来定规范,会按照业界最佳实践来:
幂等且不修改服务器状态的用 GET,幂等且修改服务器状态的用 PUT,不幂等且修改服务器状态的用 POST。

另一个知友 @苏莉安 的观点更直接:全 POST 说白了就是为了迁就低水平、不思进取的架构师和前后端程序员们。他还提到,如果用 POST 替代 PUT、DELETE、PATCH 等语义清晰的 REST 方法,甚至觉得 PUT /api/object 看不懂、只能看懂 POST /api/updateObject,那团队确实只配一个 POST 打天下。

那么,如果由你来设计公司的 API 规范,你会规定所有接口都用 POST 吗?为什么?
这个问题本身没有标准答案,如果你也有过类似的接口规范争论,不妨来 云栈社区 和其他开发者一起聊聊。
来源:www.zhihu.com/question/336797348
|