今日推荐

腾讯二面:@Bean 与 @Component 用在同一个类上,会怎么样?比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!SpringBoot 如何统计、监控 SQL运行情况?SpringBoot 那些自带 Buff 的工具类,你用过几个?最新 955 不加班的公司名单(2022版)字节跳动P0级事故:实习生删除GB以下所有模型,直接上了今日头条......

最近在逛知乎的时候发现一个有趣的问题:《公司规定所有接口都用 post 请求,这是为什么?》

原问题:zhihu.com/question/336797348

看到这个问题的时候其实我也挺有感触的,因为我也曾经这样问过我自己。在上上一家公司的时候接到一个项目是从零开始搭建一个微服务,当时就有了解过接口的一些规范,比如耳熟能详的 Restful 规范,就被应用到这个微服务项目中。

今天再次看到这个问题,我也有了一些新的理解和感触,临时回顾了一下 get 与 post 的请求的一些区别:

  1. post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)

  2. post发送的数据更大(get有url长度限制)

  3. post能发送更多的数据类型(get只能发送ASCII字符)

  4. post比get慢

  5. post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作

  6. get请求的是静态资源,则会缓存,如果是数据,则不会缓存

查看上面的区别,就会发现 post 在发送数据量大的请求时优势很显示,get 则更适合获取静态资源、简单的查询等接口。

我个人在开发接口的时候也会注意,将简单的查询请求使用 get 方法,其他增、删、改、复杂的查询请求都可以使用 post,但不会像题主的公司一样全部使用 post。

网友程墨 Morgan 提出如果是自己会按照『业界最佳实践』制定规范:

图片

程墨 Morgan

另外一个知友提出:就是为了迁就低水平不思进取的架构师和前后端程序员们

图片

知友回答

大宽宽的回答:

我打算跳出技术的范畴,从 ROI 的角度讨论下如果一个架构风格(比如 Restful)真的那么好,为啥应用上没有那么广泛?

首先要明确,不管你多么喜欢技术,无论是这里说的一个 http 的 method,又或者是编程语言的一些用法、架构设计方法、甚至是OKR这样的管理和沟通的方法。这一切,都是为了满足企业对市场的需求。简单来说,公司给你发工资,不是为了让你遵守规范的,而是为了能在成本可接受的情况下,让业务落地。

而其中,一般情况下,接口的形式是个微不足道的局部问题。对于企业来讲,技术团队要解决的更重要的问题,是理解业务模型,形成业务架构和可以稳定跑的系统;是面对大量涌入用户对系统可用性的要求对系统不会卡顿挂机的扩展性保障;是不会动不动抽疯一下,丢条数据或者数据冲突的稳定性要求,以及为了达成这些要求给监控体系的各种便利。

但一定要纠结下POST/GET,以及Restful。好吧,Restful能明确列出来的好处,就那么几点(如果有疏漏的请在评论区里补充):

  • 表达不同的业务动作语义:GET/POST/PATCH/PUT/DELETE……,

  • 表达“资源”的概念利用

  • url path,querystring,header,status code等来表达很多接口功能

  • 以上两条可以达成一种“统一”的接口表达形式,以至于可以围绕这个形式实现接口维护的工具,比如swagger。

  • Get资源可以利用缓存

但代价是什么?

  • 强行的统一,让本来天然不是资源的业务概念也一定要强行“资源“一下,引发了更多的理解不一致和沟通困难。当然,事物总是和可以“抽象”一下,业务概念抽象为“资源”很多时候都是可行的。但这这么做的收益除了证明“一个人聪明,有不错的抽象能力“,以及“更容易利用上swagger一类的工具“之外,我看不到啥额外的短期或者长期收益。

  • 乱折腾path,querysting等东西,让横切面治理抓取关键信息更难了。比如监控时抓一个path里带变量的url是非常恶心的事情。又或者看到一个404的报警,却根本搞不清楚到底是服务部署有问题;还是服务正常,但用户不存在;又或者是用户存在,但用户订单不存在。带来的问题是运营工具编写困难,线上问题响应能力会被降低。

  • 即使使用swagger,还是需要写说明和文档来说明其业务语义。接口工具应该提供的“好理解,接口改了后文档自动生成”等好处,只有在接口反应的资源刚好和后台数据表/视图能够对应上才有效。也就是说只适合接口层级低的场景下有用,而对高层接口意义不大。结果开发者既要用swagger这样的工具,同时还是要看常规文档。本来用一套机制可以解决的问题要改成两套。

  • Cache虽好,但最怕的是管控不到位让用户拿到了过期数据。对于Cache,业务上一般会区分动态接口和静态接口。前者默认不应该有cache,所以用了Get之后为了防范,还得手工在大部分动态接口上加Cache-Control: no-cache,或者动态产生ETag(浪费CPU)。而后者一般会采用CDN,这一套针对cache做了很精巧的设计。

  • 使用形式各异的method和url path,querystring上做各种奇怪的拼接,会给前端带来巨大的困扰,因为本来一个函数调用,还得翻译一遍,活生生的弄出来一个接口翻译层。妥妥的降低人效。如果是web,iOS,Android三套前端,就得弄3个接口翻译层。

  • 非GET和POST之外的method有可能会被不恰当的网关转发规则给干掉。为此Restful还是搞出了method override这样的招数……

所以到底适不适合,落地时听骂声和吵架声就知道了。

有人举了Google S3运用Restful接口的例子来说明其正确性。但S3是干什么的大家都懂,S3天然就是用来存取“资源“的。一个工具用在了恰当场景,当然是”正确“的。S3用的好的东西,只能说明类似的阿里云OSS,腾讯云COS也可以这么干。但无法证明电商业务、社交业务、I医疗业务、政企办公协同……这些业务也适合这么干。

而作为技术负责人,如果他搞出了一套接口方案(也许其中一条就是所有http接口都用post),提高了开发效率,降低了沟通成本,降低了运维和错误定位成本,为企业真正做到了降本增效。把瞎折腾的成本,投入到了其他比如业务架构设计,测试体系,线上监控,容灾降级等领域上。最终让企业(用户需求得到满足,收入增加)和员工得到了收益(因为公司收入增加而涨薪)。我会评价这样的人为“真正懂架构,懂技术,善于用技术解决实际问题。水平不知道高到哪里去了“

如果一个技术负责人只知道遵守一个书上写的,但从没验证过在自己的环境有效的方案,以至于让企业的核心目标无法达成。他就是赵括,该马上卷铺盖卷走人。

至于我司,使用的规范是。

对于动态业务接口,只有一个接口 POST /action,在Header里给X-Action给出具体的接口名称交给网关路由,session表示用户登录身份,以及用于推荐、防重、染色、安全用到的各种token/签名。所有的业务请求参数都以PB编码后放在请求体里,并和后端的gRPC体系衔接。接口除了防重试之外,不提供常规意义上的Cache。而对于静态接口,走CDN,做多级Cache。该用Get用Get。如果一个动态接口也想利用http层Cache,可以向网关申请和配置。有没有Cache,cache多久是网关和端上自己实施的,完全自己管控。

各位读者可以参考看看,并根据自己所处的业务场景和前后端交互思考下“我们目前用的技术规范是性价比最高的吗,是最合适的吗?“

如果是你来设计公司的 API 规范,会规定所有接口都用 post 请求吗,这是为什么?

最后,再给大家推荐一个GitHub项目,该项目整理了上千本常用技术PDF,技术书籍都可以在这里找到。

GitHub地址:https://github.com/hello-go-maker/cs-books

电子书已经更新好了,拿走不谢,记得点一个star,持续更新中...

公司规定所有接口都用 POST 请求,这是为什么?相关推荐

  1. 公司规定所有接口都用 POST请求?

    欢迎关注方志朋的博客,回复"666"获面试宝典 最近在逛知乎的时候发现一个有趣的问题:<公司规定所有接口都用 post 请求,这是为什么?> 看到这个问题的时候其实我也 ...

  2. 公司规定所有接口都用 POST请求,这是为什么?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 最近在逛知乎的时 ...

  3. 最近在逛知乎的时候发现一个有趣的问题:公司规定所有接口都用 post 请求,这是为什么?

    看到这个问题的时候其实我也挺有感触的,因为我也曾经这样问过我自己. 在一家公司的时候接到一个项目是从零开始搭建一个微服务,当时就有了解过接口的一些规范. 比如耳熟能详的 Restful 规范,就被应用 ...

  4. 为什么有的公司会规定所有接口都用 POST请求?

    来源 | 知乎 最近在逛知乎的时候发现一个有趣的问题:<公司规定所有接口都用 post 请求,这是为什么?> 原问题:zhihu.com/question/336797348 看到这个问题 ...

  5. 新来的CTO规定所有接口都用 post 请求...

    文章来源:http://suo.nz/1vdmri 目录 背景 get 与 post 的区别 所有接口都用 post 请求? 背景 最近在逛知乎的时候发现一个有趣的问题:公司规定所有接口都用 post ...

  6. 你写的接口都测试吗?测什么?怎么测?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://www.cnblogs.com/puresoul/p/5388586.html 本文主要分为两个部分: 第一部 ...

  7. 后端接口都测试什么?要怎么测?

    作者:Glen.He 来源:http://www.cnblogs.com/puresoul/ 本文主要分为两个部分: 第一部分: 主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两 ...

  8. Spring中毒太深,离开Spring我居然连最基本的接口都不会写了

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 来源:cnblogs.com ...

  9. 设计一个处理两种类型地址的地址簿程序_短信平台的API接口都有哪些类型?

    在这里以 SUBMAIL API 接口为例,解读下接口短信的分类和特点: SUBMAIL 的API 功能是基于云端的通信接口,用户通过接入和集成 API 就可以方便.高效地使用云通信功能,不需要先投入 ...

最新文章

  1. Flex LineChart曲线——动态加载组件
  2. Centos 升级MySQL版本或者Yum安装Mysql5.6
  3. Oracle入门(十四.7)之良好的编程习惯
  4. Linux给Java程序设置端口_扫描服务端口的Java程序
  5. 华为推出业界首个分布式云原生产品:华为云UCS,持续创新,深耕数字化
  6. 循环数组的动态规划问题
  7. Win7下建立Wifi热点
  8. 深度学习pytorch基础入门教程(1小时)-神经网络
  9. git 拉取某个分支到本地
  10. 从规范去看Function.prototype.call到底是怎么工作的?
  11. JAVA各类基础高级面试题和中间件面试题资料
  12. unable to find setter method for attribute:[commandName]
  13. 【SDPVRP问题】基于遗传算法求解同时取送货的车辆路径问题含Matlab代码
  14. 51单片机学习:蜂鸣器实验
  15. Java 中status意思_java web开发中 varStatues=quot;statusquot; 中参数status是啥作用和意思呢?这个参数的设置有啥要求呢?...
  16. 青少年软件编程(Python)等级考试试卷一级(判断题)2021-9
  17. 半岛电视台网络遭多次网络攻击
  18. [笔记分享] [Display] MIPI屏调试及举例
  19. 车载PHY的唤醒与睡眠的正确姿势
  20. (一)利用Wikipedia中文语料训练词向量word2vec——获取Wikipedia简体中文语料库

热门文章

  1. HFDS的Shell操作
  2. 音视频基础知识---音频编码格式
  3. 模式识别基本概念小结(学习笔记)
  4. 苹果采集插件全套教程-苹果cmsV10采集插件
  5. 机载点云单木分割方法和实现过程的概括介绍(论文赏析)
  6. 生成微信公众号对应二维码的两种简单方法
  7. lfs linux 教程,用LFS从零开始构建完整Linux系统
  8. 跨专业计算机 调剂,考研调剂可以跨专业调剂吗
  9. P1551 亲戚(并查集)
  10. 【WPF】CAD工程图纸转WPF可直接使用的xaml代码技巧