本文主要探讨RPC和RESTFul两种API风格的特点以及在开发中应该如何进行技术选型,同时截取了网上社区,文章一部分关于API设计的想法和观点供读者参考,取舍。

1,背景简述

API学名:应用程序接口(Application Programming Interface)

通俗的打个比方,人与人之间通过语言来交流,而程序和程序之间通过API来交流。

目前市场主流的API设计包括RPC,RESTFul,GraphQL等设计思路,关于API风格优劣,好坏众说纷纭,但客观来说:RPC资历最老,并沿用至今,RESTFul后来者居上,火了好大一阵,最新的GraphQL据说会在Githup下一版投入使用。API的选择问题丝毫不亚于跨端框架Flutter和RN的激烈斗争。但笔者坚持认为:软件开发没有银弹,技术终究会被历史裹挟,不断推进,但对于开发者来说,也许没有永恒的银弹,但在当下选择适合自己业务场景的技术却是举足轻重。

本篇文章主要探讨前两种API设计的优缺点以供读者进行技术决策的参考。

2,RPC以动词为核心

2.1 命名风格

RPC 形式的API通常是动宾结构:

getUserInfo,createUser,getUserById

由于接口的个性化需求,添加新功能时,API中可能会引入其他的动词或介词如By,With,create等等,这也是RESTFul征讨RPC的主要原因

  • 一是嫌它丑

  • 二是认为它不够通用(在服务端更新了之后,客户端也需要阅读文档,适应服务端)

3.1 常用实践

  • 面向接口编程

    在参数传递过程中使用接口而不是实现类,使程序更加灵活可扩展

    例如使用Map而不是HashMap,TreeMap,使用List而不是ArrayList,LinkedList

  • 方法重载

    通俗来讲,省去了方法名,使得API调用更加方便

3,RESTFul以名词为核心

“表述性状态转移”

3.1命名风格

/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。

3.2 常用实践

  • 资源名使用复数

    不要混淆名词单数和复数,为了保持简单,只对所有资源使用复数。

  • 避免多级 URL(存在争议)

    获取某个作者的某一类文章
    GET /authors/12/categories/2

    GET /authors/12?categories=2

    ==============================
    查询已发布的文章
    GET /articles/published

    GET /articles?published=true

4,如何对RPC和RESTFul进行技术决策?

  • 可读性

    相对于RPC,RESTFul风格的API具有更强的可读性,更加利于理解

  • 兼容性

    RESTFul相对于RPC接口,粒度更大。

    RESTFul适合应用于开发API的增删改查,而RPC适合更加精细化可定制的业务场景

在实现开发接口API,RESTFul有更好的表现。

在实现业务系统,RPC具有更高的定制化能力。

5,关于API接口设计的一些讨论

参考文章

浅谈如何设计API

restful与rpc风格

REST与RESTFul API最佳实践

API 设计最佳实践的思考

RESTful API 最佳实践

开发者必备——API设计问题的更多相关文章

  1. 现代Web应用开发者必备的六大技能

    过去,应用开发需要注重大量的专业知识,程序员只需关注单一的语言(比如COBOL.RPG.C++等),并利用该语言创建应用.而如今,时代在变迁.Web不再是单单关注独立的一面.相反,一个现代化的Web应 ...

  2. Android开发者必备的42个链接

    http://mobile.51cto.com/ahot-426035.htm Android开发者必备的42个链接 下面收集了42个帮助大家学习Android的内容链接,部分内容是面向初学者的,帮助 ...

  3. javascript的api设计原则

    前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...

  4. RESTful API 设计最佳实践

    背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个"万能"的设计标准:如何鉴权?API ...

  5. (转)Java API设计清单

    转自: 伯乐在线 Java API设计清单 英文原文 TheAmiableAPI 在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度 ...

  6. 来自HeroKu的HTTP API 设计指南(中文版)

    原文转自:http://get.jobdeer.com/343.get 来自HeroKu的HTTP API 设计指南(中文版) 翻译 by @Easy 简介 本指南中文翻译者为 @Easy ,他是国内 ...

  7. 移动互联网实战--Web Restful API设计和基础架构

    前言: 在移动互联网的大潮中, Web Restful API逐渐成为Web Server重要的一个分支. 移动端和服务端的交互, 主流的方式还是通过Http协议的形式来进行. 请求以Get/Post ...

  8. atitit.api设计 方法 指南 手册 v2 q929.docx

    atitit.api设计 方法 指南 手册 v2 q929.docx atitit.api设计原则与方法 1. 归一化(锤子钉子理论)1 1.1. 链式方法2 1.2. 规则5:建立返回值类型2 1. ...

  9. iOS开发者必备的10款工具

    当前iOS和Android两大移动操作系统“二足鼎立”,几乎覆盖了市面上大部分的智能手机.相比Android,iOS开发适配更简单,且随着各种实用工具和Swift语言的出现,iOS开发门槛地降低,开发 ...

随机推荐

  1. 上位机开发之西门子PLC-S7通信实践

    写在前面: 就目前而言,在中国的工控市场上,西门子仍然占了很大的份额,因此对于上位机开发而言,经常会存在需要与西门子PLC进行通信的情况.然后对于西门子PLC来说,通信方式有很多,下面简单列举一下: ...

  2. 什么?你还不会身份证号码验证?最全的身份证正则验证js

    话不多说上代码 //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function cidInfo(code) { var city={11:" ...

  3. jenkins环境安装(windows)

    一.简介 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.   二. Jenkins功能 1. ...

  4. java 拦截器解决xss攻击

    一.xss攻击 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序.这些恶意网页程序通常是JavaScript,但实际上也 ...

  5. 解决:Invalid character found in the request target.The valid characters are defined in RFC 7230 and RF

    背景 在将tomcat升级到7.0.81版后,发现系统的有些功能不能使用了,查询日志发现是有些地址直接被tomcat认为存在不合法字符,返回HTTP 400错误响应,错入信息如下: 原因分析 经了解, ...

  6. 从Spring Initializr开始

    出识springcloud我们这里需要建立两个项目 来感受下微服务 一.配置服务 1. Spring Initializr. 用idea自带的 Spring Initializr. 建立第一个项目 2 ...

  7. 初识MQ消息队列

    MQ 消息队列 消息队列(Message Queue)简称MQ,是阿里巴巴集团中间件技术部自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息发布订阅.消息轨迹查询.定时(延时)消息.资 ...

  8. loadRunnner中90%的响应时间

    参考博客https://blog.csdn.net/lengyue_112/article/details/1095320?utm_source=blogxgwz4 LR在场景执行完了会出个报告,其中 ...

  9. JavaWeb网上图书商城完整项目-数据库操作工具类2-MapHandle的高级用法

    1.现在在上面一章的基础上,我们引入一个address表,该表记录person类的地址,address表的格式如下所示 现在person类要和address表想关联,得到当前联系人的住宅地址,我们应该 ...

  10. JavaWeb网上图书商城完整项目--day02-17.登录功能页面实现

    1.当在登陆页面点击登陆按钮的时候,会调用UserServlet的login方法,我们要在login.jsp中进行配置 2.要在login.jsp中处理Servlet在后台业务操作之后forward到 ...