彦祖们,这种 API 接口设计有哪些利弊?

2021-07-27 10:01:34 +08:00
 ibegyourpardon

最近在复刻一些产品做练手,发现了不少新产品的 web api 接口很有意思。两个典型参考对象是 wolai.comtodoist.com

传统上,我们会根据业务需求给不同的业务设计开发出不同的 api 接口出来给前端调用。

比如某个系统叫 V2EX,包含了对帖子的增删改查,我们往往会创建

/article/create
/article/update
/article/delete
/article/get/:id
/article/list/get

等接口。

然后处理分类还有
/category/create
/category/update
等等。

当然其中还有一些可以合并的,具体不一而足,因人而异。

但我最近看到了这样一些接口。使用方法类似于

/article

然后 payload 为

{
	"resource_type": "article",
        "transaction": [{
    	"requestId": "some kind of uuid"
    	"command":"updateArticle",
        "args": {
        	"articleId": some int or uuid,
            "content": "some string",
            "blahblah": "blahblah"
        }
    }]
}

这个 payload 本身不难看懂,其中 transaction 是个数组,可以一次包含多个指令。

这个让我想起来以前我们有的时候开的玩笑,说根本不需要写很多接口,只要一个接口,传不同的参就可以干所有的事。现在看来这个玩笑不仅被人真的这么做了,还给了很完善的事务概念。

但我仍然有些困惑,这样的模式真的很好用吗?

我能想到一些优势,比如前面可以是一个很薄的 controller, 后面随着 args 的不同调用不同的 service 处理。service 可以很轻松的切换版本,不需要担心和前端的对接。队列在后端的应用也是显而易见的。

对前端来说,也不再需要看 N 个接口的文档,大多数接口会统一起来有一套标准,只要定义约定好相关的行为和参数就可以。

但这样的接口调用,是不是本身就太复杂了呢? 我大概想了下,似乎没有看到很明显的收益。我大概看了下相关的前端,有这样一个特性。

比如说列表页,我新增一个内容,传统模式是先 create,然后再获取 list,进行 data 更新。 现在会改成先操作本地 data,直接在 list 里 append,然后再发一个事务描述,告诉后端去做对应的相关操作。

我甚至在某个 app 中遇到过事务失败的问题,然后造成了多端登录的情况下有一个端死活同步不了( Todoist,事务 ID 对不上,死活不能同步数据。)

就想问问各位大佬,这种接口设计除了我自己臆想分析的特征,还有什么别的是我没考虑到的吗?

4807 次点击
所在节点    程序员
33 条回复
gfreezy
2021-07-27 12:31:21 +08:00
这看起来像是 rpc 框架生成的。实际写的可能是类似 gprc 的 proto 文件,只是传输协议用的 json
Building
2021-07-27 12:34:41 +08:00
一个本地路由。
一个服务器路由。
Building
2021-07-27 12:39:59 +08:00
以前用 php 生成模版的时候,路由就已经绑定在按钮上了,现在很多项目都不用后端生成 UI 了,直接 js 获取数据再由前端渲染 UI,这样后端就不需要再绑定路由了,所以一个入口就可以。
harryhao
2021-07-27 13:04:15 +08:00
设置不同接口方便路由,比如不同接口的请求量、认证安全级别可能不同
whajcf
2021-07-27 13:33:43 +08:00
这个好眼熟.. 然后我想到个我目前在用的一个场景: IoT 通信协议的编解码,报文根据不同的功能码携带对应的指令数据...
waibunleung
2021-07-27 13:40:43 +08:00
我感觉有点像 redis 的 pipeline 模式,管道式执行请求逻辑,一定程度上减少了接口的请求量,还能臆想到的就是能根据 command 来判断哪些 command 是可以异步 /并发执行的,哪些需要同步执行
jmyz0455
2021-07-27 13:50:58 +08:00
这种设计我还真没见过。
wolfie
2021-07-27 13:51:57 +08:00
wolai 之前抄袭道歉后 又上线了吗。
weichengwu
2021-07-27 14:03:14 +08:00
@wolfie #28 wolai 从来没道歉过吧?记得之前有个叫什么舟的抄袭道歉下架了
bz5314520
2021-07-27 14:24:31 +08:00
粗接口可以减少网络往返 ,接口设计粒度的太细就会导致业务逻辑散布到客户端,业务流交给了客户端控制。而且这也可能导致业务域不一致 比如一个上传文章 ,文章标签是必须的 ,你却把 api 拆成 上传文章再附加标签。具体如何抉择看业务,也是自身工程实践考验。软件哲学~~
111111111111
2021-07-27 15:05:05 +08:00
很自然的想到了 GraphQL,JSONRPC 啊什么的。。
karloku
2021-07-27 16:33:16 +08:00
api 的 uri 能拆就拆, accesslog 的收集分析现成工具多, 好统计好分析
用这种单 endpoint 的 rpc 风格就得自己把监控收集分析都定制一套.
好处大概是比较容易配置新的行为模板, 方便在客户端那边生成按钮.
charlie21
2021-07-27 19:04:55 +08:00
web 开发中,有没有后端完全作为接口提供数据,转发请求等操作由前端 html+js 实现的例子
https://www.zhihu.com/question/21460500
2013 年发的帖子,那时候把它称为 重前端应用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/791983

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX