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

news2024/11/22 11:23:13

文章来源:https://www.zhihu.com/question/336797348

目录

  • 背景

  • get 与 post 的区别

  • 所有接口都用 post 请求?

背景

最近在逛知乎的时候发现一个有趣的问题:公司规定所有接口都用 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.coloradmin.cn/o/623008.html

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

相关文章

正在改变一切的Ai聊天机器人

ChatGPT通过Al生成的内容让我们眼花缭乱,从一个聊天机器人转化成推动一个创新时代的技术,但,也并非人人都知道,那么,你知道Chatgpt到底是什么吗? 文章目录 前言一、什么是Chatgpt?二、如何使用C…

实用性网站推荐

1、自动去除背景图,上传图片后免费生成已去除背景的图片 ,对于有抠图需求的极为友好! https://www.remove.bg/zh/upload 2、生成各种比例的图片,自动调整图片尺寸大小 https://imagestool.com/zh_CN/resize-images.html 3、符号…

腾讯云服务器远程连接登陆的方法

腾讯云服务器怎么连接登录?腾讯云服务器支持多种远程连接方法,可以使用腾讯云管理控制台自带的远程连接工具,也可以使用第三方远程连接工具,如如PuTTY、Xshell等,Linux操作系统可以SSH登录,Windows可以使用…

力扣 37. 解数独

一、题目描述 编写一个程序,通过填充空格来解决数独问题。 数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。数独部分空格内已填入了数字&#xf…

优化 Three.js 渲染性能的实用技巧

个人主页: 左本Web3D,更多案例预览请点击》 在线案例 个人简介:专注Web3D使用ThreeJS实现3D效果技巧和学习案例 💕 💕积跬步以至千里,致敬每个爱学习的你。喜欢的话请三连,有问题请私信或者加微…

人工智能-实验三

第三次实验 一.实验目的 ​ 掌握分类算法的算法思想,包括朴素贝叶斯算法,决策树算法等。编写朴素贝叶斯算法进行分类操作。本实验主要是关于朴素贝叶斯算法的实现,在完成本实验时也复习了课程中学习的决策树分类算法的思想。 二.实验原理 …

武汉涉密系统集成资质申报的重点和难点浅析

企业想要申报涉密系统集成资质,首先要确定好申请的级别:涉密系统集成资质分甲级和乙级两个级别,这个一个是看公司体量,另外一个是看公司以后所承接的项目密级级别。级别确定好后还要确定申请哪个类别,涉密系统集成资质…

项目管理专业人员能力评价等级证书(CSPM)的级别介绍

2021年10月,中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系,开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会(CAS)组织开展的项…

使用Go和Gin编写RESTFul API

使用Go和Gin开发RESTFul API 对应的代码仓库地址:gocode 本篇内容介绍如何使用Go和 Gin Web Framework来编写RESTFul API 服务的基础知识。如果你还对Go的基础操作不熟悉的话最好还是先看一下: 入门教程 Gin是一个Go语言的Web开发框架,它简化了构建Web应…

如何实现企业微信扫码登录?

开发内容:实现网页企业微信扫码登录 企业微信提供了OAuth的授权登录方式,可以让从企业微信终端打开的网页获取成员的身份信息,从而免去登录的环节。 企业应用中的URL链接(包括自定义菜单或者消息中的链接)&#xff0c…

新手git使用记录

文章目录 前言一、下载安装git二、使用git1.基本概念2.git初始化设置3.基本操作3.1、拉取远程仓库代码,修改后在提交3.2、新建分支,提交 总结 前言 几年前在学校还学了git怎么使用,毕业后公司用tfs,这东西真的拉,感觉…

将Apple Vision Pro和visionOS与计算机视觉结合使用

在2023年6月5日的WWDC大会上,苹果宣布推出多年来最大规模的硬件和软件组合产品。今年的“One more thing”(“还有一件事”)发布是苹果视觉专业版(Apple Vision Pro),这是一款集成了苹果生态系统的新型空间…

mybatis多数据源的SQL兼容

背景 最近公司要求支持国产数据库达梦,但达梦与PostgreSQL的语法有一些差异,需要做一些兼容操作。 操作步骤 本文采用dynamic-datasource-spring-boot-starter框架处理多数据源,多数据源配置如下spring:datasource:dynamic:primary: dm #设…

华为OD机试真题B卷 Java 实现【进制转换】,附详细解题思路

一、题目描述 写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。 二、输入描述 输入一个十六进制的数值字符串。 三、输出描述 输出该数值的十进制字符串。不同组的测试用例用\n隔开。 四、解题思路 读取输入的十六进制数值字符串&…

Selenium Python教程第2章

2. Selenium 编程入门 2.1 简单用例 如果你已经安装好了selenium,你可以把下面的python代码拷贝到你的编辑器中 from selenium import webdriver from selenium.webdriver.common.keys import Keysdriver webdriver.Firefox() driver.get("http://www.pytho…

AUTOSAR DoIP介绍

DoIP是什么 DoIP全称是Diagnostic Over IP,顾名思义就是基于IP的诊断,即下图所关联的ISO13400规范,也就是说如果大家想了解DoIP可以详细阅读ISO13400。 根据下图(来自于ISO14229-1),我们可以得到以下两点关系: UDS协议(规范是ISO14229)是统一诊断服务,作为应用层协议…

浏览器相关前端开发事项

文章目录 存储浏览器持久化存储(F12->应用->存储)浏览器缓存(F12->内存)浏览器存储管理单位(域名/IP为单位)区别localStorage VS 浏览器缓存localStorage VS cookies 存储 浏览器持久化存储&…

机器视觉陶瓷板表面划痕丝印检测方法

随着陶瓷制品在建筑、电子、医疗等领域的应用越来越广泛,对陶瓷制品的质量要求也越来越高。而陶瓷制品表面的划痕和丝印等缺陷会降低产品的美观度和质量,甚至会影响产品的安全性和使用寿命。传统的陶瓷板检测方式主要依赖人工目视检测,效率低…

FL Stuido21中文版水果编曲软件下载

FL stuido水果编曲软件做舞曲以及电子乐的利器,即便是在IPAD或者电脑端上操作,都非常的简便。界面逻辑非常友好,做rnb也是很可以的东西。可以作半成品的内容,声音采样方面还行,同样需要接口卡支持。钢琴卷帘操作还算便…

华为OD机试真题 Java 实现【字符串序列判定】【2022Q4 100分】,附详细解题思路

一、题目描述 输入两个字符串a和b&#xff0c;都只包含英文小写字母。a长度<100&#xff0c;b长度<500,000。 判定a是否是b的有效子串。 判定规则&#xff1a; a中的每个字符在b中都能找到&#xff08;可以不连续&#xff09;&#xff0c;且a在b中字符的前后顺序与a中…