本文主要探讨RPC和RESTFul两种API风格的特色以及在开发中应该如何进行技术选型,截取了部分网上社区,文章关于API设计的想法和观点供读者参考取舍。html
API学名:应用程序接口(Application Programming Interface)编程
通俗的打个比方,人与人之间经过语言来交流,而程序和程序之间经过API来交流。api
目前市场主流的API设计包括RPC,RESTFul,GraphQL等设计思路,关于API风格优劣,好坏众说纷纭,但客观来讲:RPC资历最老,并沿用至今,RESTFul后来者居上,火了好大一阵,最新的GraphQL听说会在Githup下一版投入使用。API的选择问题丝绝不亚于跨端框架Flutter和RN的激烈斗争。但笔者坚持认为:软件开发没有银弹,技术终究会被历史裹挟,不断推动,但对于开发者来讲,也许没有永恒的银弹,但在当下选择适合本身业务场景的技术倒是举足轻重。restful
本篇文章主要探讨前两种API设计的优缺点以供读者进行技术决策的参考。app
RPC 形式的API一般是动宾结构:框架
getUserInfo,createUser,getUserById
因为接口的个性化需求,添加新功能时,API中可能会引入其余的动词或介词如By,With,create等等,这也是RESTFul征讨RPC的主要缘由设计
面向接口编程3d
在参数传递过程当中使用接口而不是实现类,使程序更加灵活可扩展rest
例如使用Map而不是HashMap,TreeMap,使用List而不是ArrayList,LinkedListcode
方法重载
通俗来说,省去了方法名,使得API调用更加方便
“表述性状态转移”
/admin/users (查询用户) /admin/users (新增用户) /admin/users (更新用户) /admin/users (删除用户)
虽然有点不太恰当,但RESTFul的以名词为核心的API风格其实就是把动词使用请求方法代替了,所谓的表述性状态转移实际上就是用请求方法屏蔽掉了API的部分实现。但不能否认的是,这样对于API的可读性的确有显著提升。
@RequestMapping(value = "/user", method = RequestMethod.GET) @RequestMapping(value = "/user", method = RequestMethod.DELETE)
然而,RESTFul并不能很好适应API的复杂性,例如常见的登陆注册功能使用RESTFul的风格难以对资源进行抽象。RESTFul对于单资源的增删改查的确能够实现API的升级,但因为其接口粒度过粗,对于多资源的查询操做难以设计出合理的API。
资源名使用复数
不要混淆名词单数和复数,为了保持简单,只对全部资源使用复数。
避免多级 URL(存在争议)
获取某个做者的某一类文章 GET /authors/12/categories/2 GET /authors/12?categories=2 ============================== 查询已发布的文章 GET /articles/published GET /articles?published=true
可读性
相对于RPC,RESTFul风格的API具备更强的可读性,更加利于理解
兼容性
RESTFul相对于RPC接口,粒度更大。
RESTFul适合应用于开发API的增删改查,而RPC适合更加精细化可定制的业务场景
在实现开发接口API,RESTFul有更好的表现。
在实现业务系统,RPC具备更高的定制化能力。