【布道API】API端点/资源命名最佳实践

有很多理由来驱动深思熟虑地命名 API 端点,为 API 端点选择合理的名称可以极大地平滑新开发人员的学习曲线,帮助他们直观地知道要寻找什么以及在哪里找到它,也能极大的降低开发人员之间的沟通成本。本文将介绍API端点命名的实用规范,关于REST的设计准则,可以参阅《9个REST API设计的基本准则》,在开始讨论API命名实践之前,先聊下 REST 的资源命名准则。

API端点/资源命名最佳实践

RESTful 资源命名准则

先来看看特定于 REST 的命名准则,其中一些命名实践同样适合其他风格的API,但常见于 RESTful API “端点”的命名中。

根据 Roy T. Fielding 本人的说法,没有“REST 端点”这样的东西。有资源,一组仅受 URL 长度限制限制的资源,通常资源被当做端点的子集来用。

名词 URI 作为资源

REST 易懂的特征之一是在 URI 中主要使用名词。RESTful URI 不应该使用任何类型的CRUD(创建、读取、更新、删除)功能,URI 应该用于唯一标识资源,而不是对它们进行任何操作。因此,REST API 应该允许通过一个HTTP方法操作资源,资源应该采用名词的形式。

示例: /users/{id} 代替 /getUser

“RESTful URI 应该引用一个事物(名词)的资源,而不是引用一个动作(动词),因为名词具有动词没有的属性——就像资源具有属性一样。” —— RESTfulAPI.net

多元化的资源

接下来是资源名称是否应该是复数的问题,显然,这是一个偏好问题,但是,经验丰富的 API 设计者会建议将所有资源多元化,除非它们是单一资源。

例如:/users (典型资源) 或 /users/{id}/address (单例资源)

使用斜杠 / 表示层次关系

如上面的例子所示,斜杠/ 通常用于显示单个资源和集合之间的层次结构。

例如::/users/{id}/address 显然属于 /users/{id} 的资源,该资源属于 /users集合。

“层次结构:没有任何强制规定,只需确保强加的结构对开发有意义。与软件开发工艺中的所有事情一样,命名是成功的关键。” —— RESTAPITutorial.com

标点符号的列表

当没有层次关系时(如在列表中),应该使用分号之类的标点符号或者常见的逗号。

例如:/users/{id1},{id2} 访问多个用户资源。

必要时查询参数

为了对集合进行排序或过滤,REST API 允许在 URI 中传递查询参数。 例如:/users?location=shenzhen 查找位于 shenzhen 的所有用户

使用连字符 - 提高可读性

为了使 URI 容易被开发人员理解,建议使用连字符-字符来提高长较长名称的可读性。

例如:/users/{id}/pending-orders 替代/users/{id}/pendingorders

不要使用下划线_

虽然可以用下划线_ 代替连字符 - 作为分隔符,但有些应用程序的字体,下划线 _ 字符可能会在某些浏览器或屏幕中部分被遮住或完全遮住。

为避免这种混淆,建议使用连字符 - 而不是下划线 _

例如:/users/{id}/pending-orders 替代/users/{id}/pending_orders

使用小写字母

RFC 3986 将 URI 定义为区分大小写,对于不同环境,大小写URI代表不同的路径,为了避免混淆,建议在 URI 中应始终使用小写字母。

端点命名

上面介绍了常见的REST API 资源命名规范,然而,无论 API 是否是 RESTful风格,都应该坚持一些通用的命名规范。

直观的名称(不用术语)

让端点名字更直观!在可能的情况下,选择最简单和最常用的词来代替给定的概念。如果操作正确,大多数端点/资源名应该是可以猜到其用途的,这样开发人员就不必去查看API文档了。

作为这一点的延伸,避免使用术语。知识渊博的开发人员对术语可能没有什么障碍,但大多数开发人员对于行业术语不一定都听过。

不省略(不用缩写)

避免省略端点/资源名,现代WEB技术、网络环境和设备,没这个必要节省了。事实上,缩写的名称实际上会在API中造成混淆,开发人员很难猜测(有时甚至理解)所选择的名称。

例如: /users/{id}/phone-number 代替 /users/{id}/tel-no

不用扩展名

不要在 URI 中使用文件扩展名(例如.xlsx),相对来说很难看,而且给增加了 URI 长度。如果需要指定内容的格式,建议使用Content-Type

例如: /users/{id}/pending-orders 代替 /users/{id}/pending-orders.xlsxContent-Type:application/vnd.ms-excel;charset=utf-8;

不用斜杆 / 结尾

同样,为了保持 URI 的整洁,不要在 URI 的末尾添加一个斜杠 / ,会增加语义值并可能导致混淆,最好完全放弃。

例如: /users/{id}/pending-orders 代替 /users/{id}/pending-orders/

末尾的斜杠必须没有特定的语义,资源路径必须提供相同的结果,不管它们是否有末尾的斜杠。 —— Zalando RESTful API and Event Guidelines

一致性是关键

端点命名的一致性原则是必须要遵守的,就算严格遵照上述约定,如果名称不一致,API 总是会感到特别别扭。在API中总是使用相同的名称来引用给定的资源。

本文所述的端点命名规范,有其片面性,实际开发中会有更加友好的规范,但不管何种规范何种风格,都需要确保端点名称与文档中使用的名称以及应用程序本身(如果适用)使用的名称保持一致。

例如: /users 应该记录在 users 资源下,而不是 getUser 方法下。

总结

以上总结了一些项目用得上的API端点/资源的命名规范,像简洁直观的命名规范肯定对开发人员很友好!对于更细粒度的API设计规范,推荐阅读Zalando RESTful API and Event Guidelines

restapi