请教,rest api 的设计问题,关于粒度.

2019-01-31 17:12:47 +08:00
 chaleaochexist
举个例子.
api/users?exclude=true
返回 某种情况下的 username list
api/users?exclude=false
返回 某种情况下的 username,userage,以及其他一些东西的 list.

这个例子比较简单.在我所在项目,还有需要根据 if else 返回完全不同的东西.
这些东西真的可以放到一个 api 中吗
2351 次点击
所在节点    程序员
22 条回复
guijianshi01
2019-02-13 19:36:49 +08:00
@ibegyourpardon 你这种做法功能类似的接口遇到改的时候怎么做?目前快被改给逼疯了....全部写在一起发现会不敢改,拆开会发现改不全....
ibegyourpardon
2019-02-15 17:07:56 +08:00
@guijianshi01 哈哈哈,理解理解,我就这么过来的。我的做法不敢说是完美,也是一个一个坑才过来的血泪史。

最核心的,我称为核心功能接口,我是尽最大可能划分到最细的粒度,比如一个 auth,这类接口我设计的时候原则上是不直接暴露给前端调用的,因为直接暴露意味着给前端需要请求太多的内容,无论性能还是开发流程上都不可接受,前后端会打架的。

但这类接口也不绝对,某些高频,无法也无需改动的,比如授权,这种模式下我会适当直接传给前端。

然后核心功能接口写出来其实是为了给后端调用的,用来做各种业务接口组合。这里面也是血泪史,差点和后端打疯,后端说我几个 import 的事你非要我调网络请求的形式来(我们目前的能力只能以 RESTful API 的形式互相调用),包括业务接口不一次写完,而是写完再组合… 但最后后端发现,在不同的项目中,熬过前期后,往往重新组合包装一个接口提供给前端,会变的异常轻松。

当然这里也有 API 网关这个我 18 年年初才学到的概念的支援。包括我上面讲的模式里,其实在包装组合接口提供给业务用这件事上,前端突然发现他们也有能力直接调用以及做组合了,所以业务上其实突然变的相对好一些了。

但一个系统的总体复杂度是不变的,对应的,压力放到了我这边,我自己做的这个设计和决策,现在我要为统筹管理和理清这么多接口、模式进行负责,这个压力也大。可总比和大家一起开会分析那绕来绕去的业务逻辑还是要轻松一些的。

所以我写了这么多,其实也没有直接回答你的问题。全部写一起肯定是弊大于利,畏手畏脚,甚至逼不得已要重新写一个新的大的单体出来。拆开的不合理的话,又会东改西改,并且接口功能重复,模糊,界限不清。

但就我自己的经验而言,还是要拆,拆的时候优先提炼出核心的不变的东西,尽可能在少增加额外开发的情况下将接口复用组合提供出业务接口来。而且业务接口尽量不要由核心系统直接提供,一定要有个 API gateway 层,让这个层来承担接口的分发工作。 我们用的也不好,业务中有大量冗余接口,也有很多沉没的存在安全隐患的东西,这个以后早晚要慢慢解决。但小公司,四五个人的团队,只能先到这样了。

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

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

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

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

© 2021 V2EX