只有一个原因,就是为了迁就低水平不思进取的架构师和前后端程序员们。
这问题底下好多津津乐道“这是多年一线开发经验总结出的最佳实践”的人恰好印证了这一点。
看了一下其他答案,全POST的理由大致分两类:
一是反RESTful,用POST替代PUT、DELETE、PATCH等;
姑且还有点道理,REST用Method表达语义其实是很清晰的,但它和传统RPC的思维方式并不直接兼容。而且两者也不是技术上的高低关系,无非是两种接口定义而已。
最怕的就是学个半吊子还简单粗暴硬要上REST,最后弄出个四不像,谁都理解不了。
但有人硬说PUT /api/object看不懂,只能看懂POST /api/updateObject,那只能说你确实该用一个POST包打天下。
如果一个团队有三成的人理解不了REST怎么写login,那还是放弃它吧,免得挖大坑。GET/POST也是很清晰的语法体系啊。
另一种是反GET,理由无外乎url长度和缓存,这就更让人迷惑了。
url长度问题基本都出现在多参数检索中。但是,哪怕用REST语义来分析,复杂检索也本来就该用POST。因为“检索条件-结果”是资源本身而不是一个资源列表,你创建了检索id后可以缓存结果并再次用GET获取。这种原本解决方案十分清晰的问题居然被解释为“GET放不下,我们用POST代替吧”,哭笑不得。
缓存才是不可思议的:无论移动端还是web端都有起码五六种方法来阻止缓存,你可以添加Header,可以在url加时间戳或随机数,可以用Etag,再不济可以手工清除。居然能被这个问题困住而不得不改用POST,莫非只会用浏览器调试API?
全接口POST化绝大部分时候就是为了迁就低水平技术人员。但这种说法有点伤自尊,所以往往会拿“公司统一规定”搪塞。表面显得又标准又规范,实际内里什么样很多人都清楚。
“标准太麻烦,所以堂而皇之地扔掉标准另起炉灶还以此为傲”,这种草台班子心态对一个技术人员的成长是十分有害的。
说到这儿我忽然想起某个强制规定前端一律用div的团队。h1h2h3是div,p是div,label是div,button是div,span是inline的div。语义化是什么?不懂,没用。冠冕堂皇的理由自然是所谓的标准统一好管理不出错。然而为了防止样式混乱,文档里又详细规定了一堆title1、title2、label、btn的class……
可能你们公司用了GraphQL吧
两种可能:
1、我们现在确定一下,无副作用的查询接口,使用GET请求,有副作用的操作接口,使用POST请求。
老师,那登陆应该用GET咯?
不,登陆一般用POST请求,这是特例,因为登陆通常需要表单提交,而且登陆也不是完全无副作用,blablabla……
哦,那还有哪些特例呢?
…………
……
好,我们确定一下,以后一律用POST接口。
2、对于每个接口,我们都返回一个标准的JSON,其中有一个属性标注是否成功……同时HTTP响应码都为200 OK
哎呀,错误的结果被缓存了……
经研究决定,以后不准用GET请求……
作为程序员,应该知道这种问题的准确答案应该去公司的架构师或者技术总监,他们有责任给一个解释,在知乎上问并不是正确的职业做法,知乎上啥人都有,他们的经历是他们的经历,你的公司是你的公司,你去问一个不相干的人你们公司的规定为什么,你不觉得......缘木求鱼吗?
不过,我可以给一些我自己的看法。
如果是在我现在的公司,我不会规定所有接口都是POST,我会按照『业界最佳实践』制定规范,幂等不修改服务器状态的用GET,幂等修改服务器状态的用PUT,不幂等修改服务器状态的用POST。
为啥要用『业界最佳实践』呢?
因为我司都是很牛的程序员啊,按照最科学的方式来做,才显得我们的公司尊重科学啊,按照业界最佳实践做,就是一种开放的姿态,广纳英才,我们的程序员也能够理解这样的规范,何乐而不为。
但是,如果让我去一个程序员水平良莠不齐的创业公司......我估计也会要求所有的接口都用POST请求。
这又是为啥呢?
因为我担心公司里这些打工人理解不了业界最佳实践,你和他们说幂等不修改服务器状态的用GET,幂等修改服务器状态的用PUT,不幂等修改服务器状态的用POST,他么会——
说了你又不听
听了你又不懂
懂了你又不做
做了你又做错
错了你又不认
认了你又不改
改了你又不服
不服你又不说
这样一种情况,我费那劲讲这些『业界最佳实践』的大道理干啥?
我也会简单粗暴用一种最不容易出错的方式,POST不会误用缓存,POST不受URL长度限制,POST能够用来获取也可以用来修改,那就用POST好了!
我不光规定用POST,还要通过工具强制要求用POST,API Server设置成除了POST请求都不接!
有时候就是这样最高效,费口水教育别人,还不如不给他们选择。
这科学吗?
不科学,这样不利于可持续发展,没有给员工犯错机会,所以他们难有成长。
但是话又说回来,有些程序员遇到公司技术规章问题,想到的都不是去问自己公司的架构师和技术总监,却跑到知乎上来问......也的确很难让他们成长。
再说了,员工没有犯错机会,作为创业公司的技术负责人一样没几次犯错机会了,系统搞成一坨浆糊了谁来背锅?
所以,两害取其轻,就这么简单粗暴地规定好了。
还好,我不再在创业公司工作了。
因为需要在维护初级技术人员自尊心的同时防止低级bug的出现。
很多初级程序员会选择在传参内容少的时候用GET,传参内容多的时候才使用POST,但这样一来,就会出现一些低级的bug,比如创建留言板发帖时url被缓存,导致重复发帖。
统一用POST,避免了URL缓存,也就避免了这类bug。但语义错误,会让了解语义规则的程序员觉得很不舒服,而且该用GET的地方用了POST,就没有了URL缓存,也就增加了服务器的负载压力。有些公司面试时问着如何处理高负载高并发问题,却连这种小细节都不要求,也确实是一件比较可笑的事情。
但是作为员工,没有必要去指出这一点,因为大多数公司,一千多的云主机就足够用了,压根不需要考虑负载问题。你要求公司修改这个规则,就是在说:“我不是针对谁,我是说在座各位……”
公司里知道语义规则的人应该是不少的,制定这条规则的人,心里应该也是清楚的。大家的目标都只是用最少的消耗去解决问题而已。
然后,题主既然提出了这个问题,应该是知道GET和POST的语义规则的,但是我还是在这里科普一下吧,毕竟这是一个负知识,公司里不敢说,网上总可以说一下的:
具体可以参见:
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有