API设计的几条原则

2023-05-31 0 993

API 结构设计是微服务项目结构设计中十分关键的各个环节,代表者服务项目间可视化的形式,会负面影响服务项目间的软件系统。一般而言而言,三个好的 API 结构设计须要满足用户三个主要就的目地。

API 这类的涵义指应用领域开发工具,包括所倚赖的库、网络平台、作业系统提供更多的潜能都可以叫作 API。他们在探讨微服务项目情景下的 API 结构设计都是指 WEB API,一般的同时实现有 RESTful、RPC等。API 代表者了三个微服务项目示例对内提供更多的潜能,因而 API 的数据传输文件格式(XML、JSON)对他们在结构设计 API 时的负面影响并不大。

API设计的几条原则

API 结构设计是微服务项目结构设计中十分关键的各个环节,代表者服务项目间可视化的形式,会负面影响服务项目间的软件系统。一般而言而言,三个好的 API 结构设计须要满足用户三个主要的目地:

网络平台自主性数据传输协定和最新消息文件格式的潜能。

Hardoi。在 API 已经被正式发布和非 API 版发生改变的情况下,API 如果对契约书负责管理,不如果引致数据文件格式发生破坏力的修正。在 API 须要关键性预览时,采用回退的形式修改,并对旧版留出推向市场时间询问处。

实践中发现,API 结构设计是两件极难的事,同时也极难来衡量结构设计与否杰出。根据系统结构设计和顾客的视角,得出了许多单纯的结构设计准则。

采用适用性最合适的 RESTful API

RESTful 艺术风格的 API 具备许多纯天然的竞争优势,比如通过 HTTP 协定减少了应用领域程序的谐振,具备极佳的发展性。因而愈来愈多的开发人员采用 RESTful 这种艺术风格结构设计 API,但是 RESTful 根本无法称得上三个结构设计价值观或经营理念,不是三个 API 规范化,没有许多具体内容的不动点。

因而在结构设计 RESTful 艺术风格的 API 时候,须要参照 RESTful 适用性数学模型。

API设计的几条原则根据自己的应用领域情景选择对应的适用性数学模型,一般而言系统适用性数学模型在 Level 2左右。

避免单纯封装

API如果服务项目业务潜能的封装,避免单纯封装让API彻底变成了数据库操作接口。比如标记订单状态为已支付,如果提供更多形如POST /orders/1/pay这样的API。而非PATCH /orders/1,然后通过具体内容的字段预览订单。因为订单支付是有具体内容的业务逻辑,可能涉及到大量复杂的操作,采用单纯的预览操作将业务逻辑泄漏到系统之外。同时系统外也须要知道订单状态 这个内部采用的字段。更关键的是,破坏了业务逻辑的封装,同时也会负面影响其他非功能需求。比如,权限控制、日志记录、通知等。 好的接口如果做到不多东西,不少东西。怎么理解呢?在用户修正密码和修正个人资料的情景中,这三个操作看起来很类似,然后结构设计API的时候采用了三个通用的/users/1/updateURI。然后定义了三个对象,这个对象可能直接采用了User这个类:{

“username”: “用户名”,

  “password”: “密码”

}

这个对象在修正用户名的时候, password是不必要的,但是在修正密码的操作中,三个password字段却不够用了,可能还须要 confirmPassword于是这个接口变成:

{

  “username”: “用户名”,

  “password”:”密码”,

  “confirmPassword”:”重复密码”

}

这种类的复用会给后续维护的开发人员带来困惑,同时对顾客也十分不友好。合理的结构设计如果是三个分离的 API:

// POST /users/{userId}/password

{

  “password”:”密码”,

“confirmPassword”:”重复密码”

}

// PATCH /users/{userId}

{

  “username”:”用户名”,

  “xxxx”:”其他可预览的字段”

}

对应的同时实现,在 Java 中须要定义三个 DTO,分别处理不同的接口。这也体

完全穷尽,彼此独立

API 间尽量遵守完全穷尽,彼此独立 (MECE) 准则,不如果提供更多相互叠加的 API。比如订单和订单项这三个资源,如果提供更多了形如PUT /orders/1/order-items/1 这样的接口去修正订单项,接口PUT /orders/1 就不如果具备处理某三个order-item 的潜能。这样的好处是不会存在重复的 API,造成维护和理解上的复杂性。如何做到完全穷尽和彼此独立呢?单纯的方法是采用三个表格结构设计 API,标出每个 URI 具备的潜能。API设计的几条原则结构设计。聚合根间如果彻底没有任何联系,实体和聚合根间的责任如果明确。产生这类问题的根源还是缺乏合理的抽象。如果存在 API 中可以通过用户组操作用户,通过用户的 URI 操作用户属于的用户组,这其中的问题是缺少了成员这一概念。用户组下面的本质上并不是用户,而是用户和用户组的关系,即成员。

版化

三个对内开放的服务项目,极大的概率会发生变化。业务变化可能修正 API 参数或响应数据结构,以及资源间的关系。一般而言,字段的增加不会负面影响旧的应用领域程序运行。但是当存在许多破坏力修正时,就须要采用新的版将数据导向到新的资源地址。版信息的数据传输,可以通过下面几种形式URI 前缀

Header

Query比较推荐的做法是采用 URI 前缀,比如/v1/users/常见的反模式是通过增加 URI 后缀来同时实现的,比如/users/1/updateV2。这样做的缺陷是版信息侵入到业务逻辑中,对路由的统一管理带来不便。采用 Header 和 Query 发送版信息则较为相似,不同之处在于,采用 URI 前缀在 MVC 框架中同时实现相对单纯,只须要定义好路由即可。采用 Header 和 Query 还须要编写额外的拦截器。

合理命名

结构设计 API 时候的命名涉及多个地方:URI、请求参数、响应数据等。一般而言而言最主要就,也是最难的三个是全局命名统一。其次,命名须要注意这些:

尽可能和领域名词保持一致,比如聚合根、实体、事件等

RESTful 结构设计的 URI 中采用名词复数

尽可能不要过度简写,比如将 user 简写成usr

尽可能采用不须要编码的字符

用领域名词来对 API 结构设计命名不是两件特别难的事。识别出的领域名词可以直接作为 URI 来采用。如果存在多个单词的连接可以采用中横线,比如/orders/1/order-items

安全

安全是任何一项软件结构设计都必须要考虑的事,对于 API 结构设计而言,暴露给内部系统的 API 和开放给外部系统的 API 略有不同。API设计的几条原则内部系统,更多的是考虑与否足够健壮。对接收的数据有足够的验证,并得出错误信息,而不是什么信息都接收,然后内部业务逻辑由于边界值的负面影响变得莫名其妙。而对于外部系统的 API 则有更多的挑战。错误的调用形式

接口滥用

浏览器消费 API 时因安全漏洞引致的非法访问所以结构设计 API 时如果考虑响应的应对措施。针对错误的调用形式,API 不如果进入业务处理流程,及时得出错误信息;对于接口滥用的情况,须要做许多限速的方案;对于许多浏览器顾客的问题,可以在让 API 返回许多安全增强头部,比如:X-XSS-Protection、Content-Security-Policy 等。

API 设计评审清单

URI 命名与否通过聚合根和实体统一URI 命名与否采用名词复数和连接线URI 命名与否都是单词小写URI 与否暴露了不必要的信息,比如/cgi-binURI 规则与否统一资源提供更多的潜能与否彼此独立URI 与否存在须要编码的字符请求和返回的参数与否不多不少资源的 ID 参数与否通过 PATH 参数传递认证和授权信息与否暴露到 query 参数中参数与否采用奇怪的缩写参数和响应数据中的字段命名统一与否存在无意义的对象包装 比如{“data”:{}}出错时与否破坏约定的数据结构与否采用最合适的状态码与否采用最合适的媒体类型响应数据的单复与否和数据内容一致响应头中与否有缓存信息与否进行了版管理版信息与否作为 URI 的前缀存在与否提供更多 API 服务项目期限与否提供更多了 API 返回所有 API 的索引与否进行了认证和授权与否采用 HTTPS与否检查了非法参数与否增加安全性的头部与否有限流策略与否支持 CORS响应中的时间文件格式与否采用ISO 8601标准与否存在越权访问– 相关阅读 –WEB前端安全自查和加固| 洞见采用DDD指导业务结构设计的一点思考|洞见API设计的几条原则

&绿色字体部分的相关链接。

本文版权属ThoughtWorks公司所有,如需转载请在后台留言联系。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务