Rest API 最佳设计实践( 四 )


为了执行最小权限原则,我们需要为单个角色添加角色检查,或者为每个用户添加更细化的角色 。
如果我们选择将用户分组为几个角色,那么这些角色应该具有涵盖他们需要的所有权限,仅此而已 。如果我们对用户可以访问的每个功能都拥有更精细的权限,那么我们必须确保管理员可以相应地从每个用户添加和删除这些功能 。此外,我们需要添加一些可以应用于组用户的预设角色,这样我们就不必手动为每个用户执行此操作 。
缓存数据以提高性能我们可以添加缓存以从本地内存缓存返回数据,而不是每次想要检索用户请求的一些数据时都查询数据库来获取数据 。缓存的好处是用户可以更快地获取数据 。但是,用户获得的数据可能已经过时 。当我们不断看到旧数据时出现问题时,这也可能导致在生产环境中调试时出现问题 。
缓存解决方案有很多种,比如redis、内存缓存等等 。我们可以随着需求的变化而改变缓存数据的方式 。
例如,Express 具有apicache无需太多配置即可将缓存添加到我们的应用程序的中间件 。我们可以像这样在我们的服务器中添加一个简单的内存缓存:
const express = require('express');const bodyParser = require('body-parser');const apicache = require('apicache');const app = express();let cache = apicache.middleware;app.use(cache('5 minutes'));// employees data in a databaseconst employees = [  { firstName: 'Jane', lastName: 'Smith', age: 20 },  //...  { firstName: 'John', lastName: 'Smith', age: 30 },  { firstName: 'Mary', lastName: 'Green', age: 50 },]app.use(bodyParser.json());app.get('/employees', (req, res) => {  res.json(employees);});app.listen(3000, () => console.log('server started'));上面的代码只是引用了apicache中间件,apicache.middleware然后我们有:
app.use(cache('5 minutes'))
将缓存应用于整个应用程序 。例如,我们将结果缓存五分钟 。我们可以根据需要进行调整 。
如果您使用缓存,您还应该Cache-Control在标题中包含信息 。这将帮助用户有效地使用您的缓存系统 。
版本控制我们的 API如果我们对它们进行任何可能破坏客户端的更改,我们应该有不同版本的 API 。可以像现在大多数应用程序一样,根据语义版本(例如,2.0.6 表示主要版本 2 和第六个补丁)进行版本控制 。
这样,我们可以逐步淘汰旧的端点,而不是强迫每个人同时迁移到新的 API 。v1 端点可以为不想改变的人保持活跃,而 v2 具有闪亮的新功能,可以为那些准备升级的人提供服务 。如果我们的 API 是公开的,这一点尤其重要 。我们应该对它们进行版本控制,这样我们就不会破坏使用我们 API 的第三方应用程序 。
版本通常有做/v1/,/v2/等在API路径的开始增加 。
例如,我们可以使用 Express 执行此操作,如下所示:
const express = require('express');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.json());app.get('/v1/employees', (req, res) => {  const employees = [];  // code to get employees  res.json(employees);});app.get('/v2/employees', (req, res) => {  const employees = [];  // different code to get employees  res.json(employees);});app.listen(3000, () => console.log('server started'));我们只需将版本号添加到端点 URL 路径的开头即可对其进行版本控制 。
结论设计高质量 REST API 最重要的一点是通过遵循 Web 标准和约定来保持一致性 。JSON、SSL/TLS 和 HTTP 状态代码都是现代 Web 的标准构建块 。
性能也是一个重要的考虑因素 。我们可以通过不一次返回太多数据来增加它 。此外,我们可以使用缓存,这样我们就不必一直查询数据 。
端点的路径应该是一致的,我们只使用名词,因为 HTTP 方法表明我们想要采取的行动 。嵌套资源的路径应该在父资源的路径之后 。他们应该告诉我们我们正在获取或操作什么,而无需阅读额外的文档来了解它在做什么 。




推荐阅读