node.js - Node.js REST API 版本控制是否正确?
问题描述
我想根据 URL 版本指定来管理我的 REST API。
例如:
api.mydomain.com/v1/rides/
// will return all rides based on v1.
api.mydomain.com/v2/rides/
// will return all rides based on v2 (probably with some braking changes).
api.mydomain.com/rides/
// will return all rides based on v2, since v2 is the newest.
棒极了。
在我们开始处理处理这个问题的实际方法之前,我们应该谈谈逻辑上的“默认最新版本”——我的意思是,如果用户不指定任何类型的版本,我应该为他提供最新版本还是抛出404 未找到错误?
我应该强制用户指定 API 版本吗?
如果我这样做,是否有任何“解析”特定/最新版本的标准?
我告诉你为什么我对此感到担忧:假设“Dan”安装了应用程序,该应用程序在最新的 API 端点(例如 V1)上进行中继,然后我发布了具有制动变化的 V2。由于 Dans 默认“监听”最新版本,因此 Dans 应用程序将崩溃。
这根本不是一个好的行为。也许我应该阻止使用“默认的最新版本”?也许我应该使用 Dans 应用程序来监听特定版本,而远程开发人员将我的 API 作为 Web 服务访问可以在默认情况下有权在特定版本或最新版本之间进行选择?
有什么标准吗?
**
现在让我们实际谈谈。假设我有一个处理这些请求的路由器,可能是这样的:
// app.js file
app.use((req, res, next) => {
try {
require('../resources/' + req.url.split('/')[1] + '/' + req.url.split('/')[1] + '-router')(app);
next();
} catch(err) {
dep.cast(res, 404, new Error("Not Found"));
}
});
还有一些处理程序,像这样:
// resources/rides/rides-router.js file
module.exports = function(app) {
// GET ride - select a ride
app.get("/v1/rides/:id", dep.verifyToken(), require('./api/v1/get-ride'));
app.get("/v2/rides/:id", dep.verifyToken(), require('./api/v2/get-ride'));
// POST ride - insert a new ride
app.post("/v1/rides", dep.verifyToken(), require('./api/v1/set-ride'));
}
如您所见,我有处理程序将请求发送到 API 中的特定部门,按 V1、V2 等分割。
这让我想知道它是否有权在不同的文件夹中一遍又一遍地拥有包含相同功能的相同页面,一个用于 V1,一个用于 V2。当然,有一些制动变化,但它们可能会相似。它不是与重复代码接壤吗?
看项目结构:
你怎么看待这件事?
解决方案
您可以在应用程序级别添加它,而不是在每条路线中添加版本。所以它不会与 API 路由紧密耦合。
import * as express from 'express';
// v1/get-ride.js
const router = express.Router();
router.post('/rides/:id', dep.verifyToken(), (req, res) => {
// Your code
});
app.use('/v1', router);
// v2/get-ride.js
const router = express.Router();
router.post('/rides/:id', dep.verifyToken(), (req, res) => {
// Your code
});
app.use('/v2', router);
推荐阅读
- linux - dotnet CLI 运行没有 cs 文件的单个字符串,例如 dotnet run "System.Console(DateTime.Now);" 在 Linux 上
- docker - 当所有给定的 gpg 密钥服务器都不可用时,我可以使用另一个 gpg 密钥服务器吗?
- php - 错误系统库:fopen:没有这样的进程
- android - 安卓usb存储刷新
- c++11 - Linux 上的时间转换失败
- python - 解码为str:需要一个类似字节的对象,在Django中使用Render函数时发现HttpResponse
- vb.net - 将 json 转换为数据表 vb.net
- javascript - Discord.js DiscordAPI 错误:未知表情符号 - 对嵌入做出反应
- python - SwiftyRSA && Python 的签名验证密码学
- java - 如何在没有内容提供者的情况下将自定义 WhatsApp 贴纸从 firebase 添加到 WhatsApp?