Node.js REST API 版本控制的正确方式?
Node.js REST API versioning the right way?
我想根据 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.
太棒了。
在我们开始处理这个问题的实际方法之前,
我们应该讨论逻辑 "default newest versioning" - 我的意思是,如果用户不打算指定任何类型的版本,我应该为他提供最新版本还是抛出 404 未找到错误?
我应该要求用户指定 API 版本吗?
如果有,有没有"parsing"具体/最新版本的标准?
我告诉你我为什么担心这个:假设 "Dan" 安装了应用程序,该应用程序在最新的 API 端点(例如 V1)上中继,然后我发布具有制动变化的 V2 .
由于Dans "listens" 默认为最新版本,Dans 应用程序将崩溃。
这根本不是什么好行为。
也许我应该阻止使用 "default newest versioning"?
也许我应该使用 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。
当然,有一些制动变化,但它们可能会相似。是不是和重复代码接壤?
查看项目结构:
你怎么看这个?
没有 "right way" 可以进行 API 版本控制。
但是,根本没有基于 URI 的全局版本控制 RESTful。
"APIs you won't hate" 的 Phil Sturgeon 建议改用 API 进化方法。
参见:https://apisyouwonthate.com/blog/api-evolution-for-rest-http-apis
您考虑过这个选项吗?
您可以在应用级别添加它,而不是在每个路由中添加版本。所以它不会与 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);
我建议改用 node-express-versioning 模块。
这将帮助您在不更改 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();
}*
*
我想根据 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.
太棒了。
在我们开始处理这个问题的实际方法之前, 我们应该讨论逻辑 "default newest versioning" - 我的意思是,如果用户不打算指定任何类型的版本,我应该为他提供最新版本还是抛出 404 未找到错误?
我应该要求用户指定 API 版本吗?
如果有,有没有"parsing"具体/最新版本的标准?
我告诉你我为什么担心这个:假设 "Dan" 安装了应用程序,该应用程序在最新的 API 端点(例如 V1)上中继,然后我发布具有制动变化的 V2 . 由于Dans "listens" 默认为最新版本,Dans 应用程序将崩溃。
这根本不是什么好行为。 也许我应该阻止使用 "default newest versioning"? 也许我应该使用 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。 当然,有一些制动变化,但它们可能会相似。是不是和重复代码接壤?
查看项目结构:
你怎么看这个?
没有 "right way" 可以进行 API 版本控制。
但是,根本没有基于 URI 的全局版本控制 RESTful。
"APIs you won't hate" 的 Phil Sturgeon 建议改用 API 进化方法。
参见:https://apisyouwonthate.com/blog/api-evolution-for-rest-http-apis
您考虑过这个选项吗?
您可以在应用级别添加它,而不是在每个路由中添加版本。所以它不会与 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);
我建议改用 node-express-versioning 模块。
这将帮助您在不更改 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();
}*
*