首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Node.js REST版本化是正确的吗?

Node.js REST版本化是正确的吗?
EN

Stack Overflow用户
提问于 2018-07-25 07:59:14
回答 3查看 31K关注 0票数 24

我想管理我的REST基于URL版本指定。

例如:

代码语言:javascript
运行
复制
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,可以在默认情况下选择特定版本还是最新版本?

有标准吗?

**

现在让我们实际地谈谈。可以说我有一个路由器来处理这些请求,也许是这样的:

代码语言:javascript
运行
复制
// 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"));
  }
});

和一些处理程序,像这样:

代码语言:javascript
运行
复制
// 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。当然,有一些刹车的变化,但它们可能是相似的。它不是与重复代码相邻吗?

看一下项目结构:

你觉得这个怎么样?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-25 08:24:46

与其在每个路径中添加版本,不如将其添加到应用程序级别。因此,它不会与API路由紧密耦合。

代码语言:javascript
运行
复制
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);
票数 30
EN

Stack Overflow用户

发布于 2019-04-10 07:47:35

我建议使用节点-快速版本控制模块代替。

它将帮助您支持多个版本而不更改API的url,只需发送API的版本并将调用定向到版本路由控制器。

代码语言:javascript
运行
复制
*

*//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();
    }*

*

票数 8
EN

Stack Overflow用户

发布于 2018-07-25 08:11:51

没有“正确的方法”来进行API版本控制。

然而,基于URI的全局版本控制根本不是RESTful。

“你不会讨厌的API”的菲尔·斯特金推荐了一种API进化方法。

请参阅:https://apisyouwonthate.com/blog/api-evolution-for-rest-http-apis

你认为这是一种选择吗?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51513715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档