我想管理我的REST基于URL版本指定。
例如:
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应用程序来侦听特定版本,而远程开发人员作为web服务访问我的API,可以在默认情况下选择特定版本还是最新版本?
有标准吗?
**
现在让我们实际地谈谈。可以说我有一个路由器来处理这些请求,也许是这样的:
// 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。当然,有一些刹车的变化,但它们可能是相似的。它不是与重复代码相邻吗?
看一下项目结构:

你觉得这个怎么样?
发布于 2018-07-25 08:24:46
与其在每个路径中添加版本,不如将其添加到应用程序级别。因此,它不会与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);发布于 2019-04-10 07:47:35
我建议使用节点-快速版本控制模块代替。
它将帮助您支持多个版本而不更改API的url,只需发送API的版本并将调用定向到版本路由控制器。
*
*//version taken out from header
app.use(function(req, res, next)
{
req.version = req.headers['accept-version'];
console.log(req.version);
next();
});
//version path defined
app.use('/api', versionRoutes({
"1.0.0": respondV1,
"2.0.0": respondV2
}));
function respondV1(req, res, next)
{
app.use('/api',routeV1);
next();
}
function respondV2(req, res, next)
{
app.use('/api',routeV2);
next();
}**
发布于 2018-07-25 08:11:51
没有“正确的方法”来进行API版本控制。
然而,基于URI的全局版本控制根本不是RESTful。
“你不会讨厌的API”的菲尔·斯特金推荐了一种API进化方法。
请参阅:https://apisyouwonthate.com/blog/api-evolution-for-rest-http-apis
你认为这是一种选择吗?
https://stackoverflow.com/questions/51513715
复制相似问题