面试题:公司规定所有接口都用 post 请求,这是为什么?

文章目录

  • 前言
  • get 与 post 的区别
  • 所有接口都用 post 请求?
    • 网友程墨 Morgan
    • 网友苏莉安
    • 网友大宽宽


前言

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

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


get 与 post 的区别

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

  • post 更安全(不会作为 url 的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)
  • post 发送的数据更大(get 有 url 长度限制)
  • post 能发送更多的数据类型(get 只能发送 ASCII 字符)
  • post 比 get 慢
  • post 用于修改和写入数据,get 一般用于搜索排序和筛选之类的操作
  • get 请求的是静态资源,则会缓存,如果是数据,则不会缓存

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

我个人在开发接口的时候也会注意,将简单的查询请求使用 get 方法,其他增、删、改、复杂的查询请求都可以使用 post,但不会像题主的公司一样全部使用 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 请求吗,这是为什么?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可编程电子负载的应用前景如何

可编程电子负载是一种模拟真实负载的电子设备,它可以模拟各种不同类型和规格的负载,如电阻、电容、电感等。通过可编程的方式,用户可以根据需要灵活地调整负载的大小、电压、电流等参数,以满足不同的测试需求。随着科技的不断发展…

pod容器内无法访问集群外部主机ipv6地址

一、背景 同事反馈他这边有一环境出现pod容器内无法请求集群外部主机ipv6地址,但是在pod所在集群所主机上是可以请求到外部主机ipv6地址。 二、问题处理过程 首先主机和主机之间ipv6地址能通讯,说明主机之间网络是没啥问题,哪问题就出在容器…

微信小程序已经审核通过但是提示订单中心path不通过

设置-基本设置-服务内容声明 更改path重新审核即可

ABCDE类网络的划分及保留网段

根据IP地址的分类,IP地址被分为A、B、C、D和E五类。下面是对ABCDE类网络的划分及保留网段的详细描述: A类网络:范围从1.0.0.0到127.0.0.0,网络地址的最高位必须是“0”,可用的A类网络有127个,每个网络能容…

【算法提升—力扣每日一刷】五日总结【11/30-12/04】

2023/11/30 力扣每日一刷:1.两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元…

TCP协议实现一对一聊天

服务端代码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;/*** 发送消息线程*/ class Send e…

linux无法打开M4a格式音频的解决方法

linux是开源系统,之所以打不开,是因为部分linux系统为了避免版权问题,没有m4a的解码插件。所以,解决的办法是安装如下两个非常小的转换器,我们一般用不到转换器的功能,而是反向应用,通过两个几十…

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器安装Bolo开源博客

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器(Elastic Compute Cloud)是亚马…

shell脚本实战之mysql-物理备份实现周内备份策略

一.shell脚本要求 # 数据库备份脚本方式: 物理备份# 工具:xtrabackup过程# 需求1:不允许有任何的安在脚本中,# 需求2:在脚本中,不允许有任何的交互式代码容,使用日志记录# 需求3:在脚本中,不允许有任何输出# 需求4:每周为一个循环…

TA-Lib学习研究笔记(九)——Pattern Recognition (6)

TA-Lib学习研究笔记(九)——Pattern Recognition (6) 最全面的形态识别的函数的应用,通过使用A股实际的数据,验证形态识别函数,用K线显示出现标志的形态走势,由于入口参数基本上是o…

百度/抖音/小红书/微信搜索品牌形象优化怎么做?

搜索口碑是网络营销不可或缺的一部分,企业如何做好品牌搜索口碑优化呢?小马识途营销顾问建议从以下几方面入手。 1. 通过关键字优化提高自身知名度 通过对竞争对手和目标客户的关键字进行分析,企业可以确定哪些关键字可以提高自身品牌知名度。…

IDEA Maven 配置国内源

基本步骤 分别设置下图的两个,一个是对当前项目的设置,一个是对以后创建的项目设置,这样以后就不用重新配置了。 将下面的两个勾选上 注意,两个地方,Settings 和 Settings for New Projects 的勾都要勾上。 前往 User…

PHP短信接口防刷防轰炸多重解决方案三(可正式使用)

短信接口盗刷轰炸:指的是黑客利用非法手段获取短信接口的访问权限,然后使用该接口发送大量垃圾短信给目标用户 短信验证码轰炸解决方案一(验证码类解决)-CSDN博客 短信验证码轰炸解决方案二(防止海外ip、限制ip、限制手机号次数解决)-CSDN博客 PHP短信…

SQL Sever 基础知识 - 数据筛选(1)

SQL Sever 基础知识 - 四、数据筛选 四、筛选数据第1节 DISTINCT - 去除重复值1.1 SELECT DISTINCT 子句简介1.2 SELECT DISTINCT 示例1.2.1 DISTINCT 一列示例1.2.2 DISTINCT 多列示例 1.2.3 DISTINCT 具有 null 值示例1.2.4 DISTINCT 与 GROUP BY 对比 第2节 WHERE - 过滤查询…

8_企业架构缓存中间件分布式memcached

企业架构缓存中间件分布式memcached 学习目标和内容 1、能够理解描述网站业务访问流程 2、能够理解网站业务的优化方向 3、能够描述内存缓存软件Memcached的作用 4、能够通过命令行操作Memcached 5、能够操作安装php的memcached扩展 extension 6、能够实现session存储到memcach…

mysql数据库(表)误删恢复

mysql数据库(表)误删恢复 1. 检查mysql服务是否开启binlog # 查看是否开启binlog日志 show variables like %log_bin%;看下图结果.如果这里是OFF那就不用看下去了.本文帮助不了 2.开启binlog日志(已开启略过) 1、编辑打开mysql配置文件 ***/my.cnf在 [mysqld]区块添加 l…

第五届CECC中国计算机教育大会召开,文心大模型助力跨学科创新融合

随着科技的飞速发展,大模型已经成为教育、科研等领域的热点话题。12月2日至3日,以“新时代 新计算 新理念”为主题的第五届中国计算机教育大会(CECC)在厦门召开,百度飞桨和文心大模型承办的“大模型技术创新与教育实践…

婴儿专用洗衣机有必要吗?宝宝洗衣机洗衣服

相信各位宝爸宝妈都有同样的苦恼,那就是宝宝的衣服该怎么来洗宝宝每天都有一大堆衣物和各种巾要洗,如果单纯用手洗,真的是一个很大的工程,将宝宝的衣服丢进去家庭用的洗衣机,宝宝稚嫩的皮肤又怕会被细jun感染到&#x…

智能优化算法应用:基于梯度算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于梯度算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于梯度算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.梯度算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Qt/C++视频监控拉流显示/各种rtsp/rtmp/http视频流/摄像头采集/视频监控回放/录像存储

一、前言 本视频播放组件陆陆续续写了6年多,一直在持续更新迭代,视频监控行业客户端软件开发首要需求就是拉流显示,比如给定一个rtsp视频流地址,你需要在软件上显示实时画面,其次就是录像保存,再次就是一些…