小二刚去一家公司实习俩月,就收到一则震惊了他双眼的通知:“公司规定所有接口都用 POST请求!”他非常不解,跑来问我。
我说:因为需要防止低级 bug 的出现以及初级开发人员的自尊心。
小二将信将疑,我又说:讲真,我菜鸟时期,一般是这样认为的。
关键是,我感觉自己特别的专业,你知道吗?
直到我用 GET 传参的时候出现了一些低级 BUG,比如说 URL 被缓存,导致重复下单。
用 POST 就可以轻而易举地避免 URL 缓存。
按照「业界最佳实践」的制定规范:幂等不修改服务器状态的用 GET,幂等修改服务器状态的用 PUT,不幂等修改服务器状态的用 POST。
可有的时候,规范就会造成干扰:幂等是什么?服务器状态是什么?
对!
说了你又不听
听了你又不懂
懂了你又不做
做了你又做错
错了你又不认
认了你又不改
改了你又不服
不服你又不说
那为了不出错,简单粗暴的 POST 就是最佳的解决方案。
拥抱 POST 吧,头发很宝贵的。
小二听我这么一说,还是不放心,我把上次面试官:GET 和 POST 到底有什么区别?的文章就甩给了他,要他好好看看。
小二看完后,又追着我继续问:Restful真的那么好,为啥应用上没有那么广泛?
我就把大宽宽答主的另外一个回答扔给了他,以下是部分内容。
编辑:沉默王二,链接:https://www.zhihu.com/question/336797348
首先要明确,不管你多么喜欢技术,无论是这里说的一个http的method,又或者是编程语言的一些用法、架构设计方法、甚至是OKR这样的管理和沟通的方法。这一切,都是为了满足企业对市场的需求。
简单来说,公司给你发工资,不是为了让你遵守规范的,而是为了能在成本可接受的情况下,让业务落地。
而其中,一般情况下,接口的形式是个微不足道的局部问题。对于企业来讲,技术团队要解决的更重要的问题,是理解业务模型,形成业务架构和可以稳定跑的系统;是面对大量涌入用户对系统可用性的要求对系统不会卡顿挂机的扩展性保障;是不会动不动抽疯一下,丢条数据或者数据冲突的稳定性要求,以及为了达成这些要求给监控体系的各种便利。
但一定要纠结下POST/GET,以及Restful。好吧,Restful能明确列出来的好处,就那么几点:
但代价是什么?
所以到底适不适合,落地时听骂声和吵架声就知道了。
作为技术负责人,如果他搞出了一套接口方案(也许其中一条就是所有http接口都用post),提高了开发效率,降低了沟通成本,降低了运维和错误定位成本,为企业真正做到了降本增效。
把瞎折腾的成本,投入到了其他比如业务架构设计,测试体系,线上监控,容灾降级等领域上。最终让企业(用户需求得到满足,收入增加)和员工得到了收益(因为公司收入增加而涨薪)。
我会评价这样的人为“真正懂架构,懂技术,善于用技术解决实际问题。水平不知道高到哪里去了“。
如果一个技术负责人只知道遵守一个书上写的,但从没验证过在自己的环境有效的方案,以至于让企业的核心目标无法达成。他就是赵括,该马上卷铺盖卷走人。
至于我司,使用的规范是。
对于动态业务接口,只有一个接口 POST /action,在Header里给X-Action给出具体的接口名称交给网关路由,session表示用户登录身份,以及用于推荐、防重、染色、安全用到的各种token/签名。
所有的业务请求参数都以PB编码后放在请求体里,并和后端的gRPC体系衔接。接口除了防重试之外,不提供常规意义上的Cache。而对于静态接口,走CDN,做多级Cache。
该用Get用Get。如果一个动态接口也想利用http层Cache,可以向网关申请和配置。有没有Cache,cache多久是网关和端上自己实施的,完全自己管控。
小二看完这个帖子后,长长地“哦”了一声,我明白他是真的懂了,为什么公司规定所有接口都用 POST请求了!
没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。