`

(转)这样设计 RESTFul API,也许能让你效率倍增

 
阅读更多
在目前移动端、前端趋于统一的大背景下,基于 RESTFul 的 API 也大放异彩,我们需要越来越多的与 API 打交到,设计可扩展,易于维护的 API 在我们的工作中也变得更加重要。那么,有没有可能,通过一定测策略与指导方法,让 API 的设计更规范,更有章可循,高效率的设计出好用的 API 呢?本文尝试总结笔者在这方面的思考,希望对读者有所启发。

在开始之前,我们先做一个定义,那就是什么样的 API 能够算得上优秀的 API,如下是笔者认为优秀 API 需要满足的四个要素:

1. 遵循业界最佳实践
2. 高度的统一性和一致性,优秀的 API 一定是高度一致和统一的,遵循一定的共性和约定
3. 基于深刻理解业务的合理抽象
4. 探索业务共性,总结规范

这四个要素层层递进,亦可以作为我们进行 API 设计的指导方法,下面详细介绍笔者对这四个要素的理解,必要的时候提供案例进行说明。

遵循业界最佳实践

遵循业界最佳实践我觉得是优秀 API 应具备最基本的一个要素,它能让相关人员最快的理解,建立统一的基础认知,如果我们的 API 对外的,这就显得更加重要。

就本文而言,笔者所说的业内最佳实践指的是基于 HTTP 的 RESTful API。它用 URI 表示资源,用 HTTP Verb 表示操作,要设计好 RESTFul API,很大程度上需要处理好对资源的抽象。

至于 RESTFul API 更具体是个什么东西,有哪些原则,本文不做更多探讨,互联网上相关的资料很多。

高度的统一性和一致性

如果说遵循业界最佳实践是基础,那么保持 API 的统一性和一致性就是设计合格 API 的保障。如果我们的 API 不统一、不一致,缺少必要约定,使用者必然会感到困惑,学习成本与维护成本必然大大增加。

下面是保证 API 高度统一和一致性需要考虑的一个列表,也许并不完整:

1. 授权与鉴权方式的统一
2. 每个 API 分页方式与对应参数的统一
3. 排序参数与对应行为的统一一致
4. 查询条件的写法经事先约定且保持一致
5. 考虑存在于全局的参数,形成基础认知
6. 等等等

深度理解业务的高度抽象

如果我们的 API 满足了前面两个要素,那它应该基本算是合格了,能够满足日常业务的需要,但对于优秀的 API,这才刚刚开始。

许多人在设计 API 的时候,没有大局观,仅仅为界面而设计,只有前台界面一变化,API 可能又需要重新设计,从而导致 API 扩展性差,频繁修改。

所以,我们在设计 API 的时候,就需要站在更高的维度,在深入理解业务的前提下,抽象出更高层次的 API。这样的 API 一般是界面无关的,即便界面变化,只要不是业务的调整,影响也不会很大。

优秀的 API 就像优秀的产品,不在于提供了多少 API (功能),而在于解决了多少问题。一个优秀的 API 能直接解决多个一般 API 才能解决的问题。

下面举一个例子:

假如,我们有这样一个需求,在一个博客系统中,我们需要获取全站访问最多和访问最少的文章,各n篇文章,应该怎样设计 API 呢?
有下面两个版本:

版本一:

提供两个API,如下:

GET /posts/most-viewed?limit=10 - 获取访问最多的文章
GET /posts/least-viewed?limit=10 - 获取访问最少的文章
版本二:
提供一个API,使用sort参数排序,间接实现需求

GET /posts?sort=total_views desc&limit=10 - 获取访问最多的文章
GET /posts?sort=total_views asc&limit=10 - 获取访问最少的文章
笔者认为,版本二会更好一些,直接使用已有 API 加排序完成需求,扩展性和抽象层次都更高。
探索业务共性,总结规范

每个业务都可能有它的共性,如果把这些共性提炼出来,形成规范,就会极大的提高 API 的设计及开发效率,API 的使用也会因此受益,因为整体 API 的理解会容易许多。

就比如笔者目前所在的公司,面临许多 toB 业务,有许许多多的聚合统计需求,如果把每个统计需求都写成单独的API,那 API 的数量恐怕浩如烟海,也很难维护。

所以,我们就在思考,如何把这些共性的统计需求就行抽象,总结成规范,变成 API 设计规范的一部分,从而指导 API 设计。

比如说,我们有如下的业务需求:

用户的状态(status)有 active, disabled 和 achieved 三种,需要统计满足条件用户三个状态各自的数量。
在我们目前API设计规范下,我们会用如下的方式解决这个需求,而非提供新的 API:

GET /users?kw=foo&$aggregate=status 按 status 就行聚合统计,kw是查询参数
这里我们引入了 $aggregate 的聚合方法,在不添加新 API 的情况下解决该需求,该方式也变成解决该类问题规范。

设计优秀 API 的四个要素介绍完了,希望对你有所帮助,以后笔者会再分享 API 规范的设计思路~

2017年2月18日
分享到:
评论

相关推荐

    RESTful API设计规范

    ### RESTful API设计规范详解 #### 一、RESTful简介 RESTful是一种广泛应用于Web服务的设计风格,全称为Representational State Transfer(表述性状态转移)。它并非一项具体的技术标准,而是一系列设计原则和约束...

    OPCDA转restfulAPI,opcDA与mes或其它第三方通讯服务

    OPCDA转restfulAPI,opcDA与mes或其它第三方通讯服务 x86

    Python Flask高级编程之RESTFul API前后端分离精讲第七章节

    Python Flask高级编程之RESTFul API前后端分离精讲第六章节Python Flask高级编程之RESTFul API前后端分离精讲第六章节Python Flask高级编程之RESTFul API前后端分离精讲第六章节Python Flask高级编程之RESTFul API...

    k8s restful api 访问

    restful api访问k8s集群,增删改查信息。 需要预先创建访问权限的配置。 官网api文档 https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.9/ 下面罗列部分api curl -u admin:admin ...

    RESTful API 设计最佳实践

    RESTful API 设计最佳实践是构建可扩展、高效且易于使用的Web服务的关键。遵循REST(Representational State Transfer)原则,可以确保API与Web的核心概念——HTTP协议紧密结合,从而实现资源的透明操作。以下是对...

    SpringBoot+Mybatis+CXF框架,实现Restful api与 WebService api接口的大实验

    描述:本实验使用SpringBoot、Mybatis和CXF框架来实现Restful API和WebService API接口的大实验,涵盖了数据库设计、 Maven依赖管理、Restful API和WebService API的实现等方面。 标签:spring boot、mybatis、...

    RESTFul API 接口说明

    ### RESTful API 接口说明 #### 一、RESTful API 概述 RESTful(Representational ...合理的URI设计、清晰的HTTP动词使用以及正确的状态码返回,不仅能够提高系统的可读性和可维护性,还能让API更加易于理解和使用。

    RestfulApi服务端.zip

    本项目提供了一个RestfulApi服务端的示例,帮助开发者了解如何构建这样的服务。 在RestfulApi服务端的实现中,通常会用到以下技术栈: 1. **服务器框架**:如Spring Boot或Express.js,它们为快速构建RESTful API...

    thinkphp6 RESTful API开发

    thinkphp6 RESTful API开发 开发过程记录笔记 https://blog.csdn.net/weixin_41120504/article/details/115638094

    RestFul API 案例

    以上就是关于RESTful API的基本知识点,结合提供的"RestFul API.pptx"和"TEST.zip"文件,你可以深入学习具体的案例,了解如何设计和实现一个RESTful API。实践中,我们通常会用到如Spring Boot这样的框架来快速构建...

    RESTFUL API设置最佳实

    ### RESTful API 设计最佳实践 #### 一、引言 随着互联网技术的发展,Web 应用变得越来越复杂,为了支持这些应用的功能扩展和服务交互,API 的设计变得尤为重要。RESTful API 是一种基于 HTTP 协议的应用程序编程...

    Python Flask高级编程之RESTFul API前后端分离精讲第一讲解

    Python Flask高级编程之RESTFul API前后端分离精讲Python Flask高级编程之RESTFul API前后端分离精讲Python Flask高级编程之RESTFul API前后端分离精讲Python Flask高级编程之RESTFul API前后端分离精讲Python Flask...

    Python-带RESTfulAPI的自托管文档转换服务

    标题中的“Python-带RESTful API的自托管文档转换服务”指的是使用Python编程语言构建的一种服务,该服务提供了RESTful应用程序接口(API)用于处理文档转换。RESTful API是一种架构风格,广泛应用于分布式系统,...

    RESTfulAPI设计:RESTfulAPI设计基础.docx

    RESTfulAPI设计:RESTfulAPI设计基础.docx

    Python语言开发RESTful API指南

    接下来,让我们详细探讨Python语言开发RESTful API的核心知识点。 首先,RESTful API的开发和使用本质上涉及客户端与服务器之间的请求(Request)和响应(Response)交互。按照REST架构风格的统一接口原则,不同的...

    c c++实现http服务 c c++开发restful api服务

    同时,良好的错误处理机制能帮助识别并修复问题。 在`XEngine_HttpServer`这个文件中,很可能是实现上述功能的一个HTTP服务器框架。通过阅读和理解这个代码,你可以学习到如何在C/C++中实际操作上述步骤。`说明.txt...

    基于 RESTful 架构的API设计原则和规范.docx

    基于 RESTful 架构的 API 设计原则和规范 RESTful 架构是目前最流行的一种互联网软件架构,它结构清晰、符合标准、易于理解、扩展方便,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。因此...

    lighttpd restfulapi cgi

    例如,如果使用Python,你可以使用`flask`这样的微框架来简化这一过程。 **五、安全与性能优化** 在部署lighttpd RESTful API和CGI服务时,还需考虑以下几点: 1. **权限控制**:确保API接口有适当的访问限制,如...

Global site tag (gtag.js) - Google Analytics