Restify:URL中的API版本

Tom*_*mas 7 routes node.js restify

目前正在开发具有restify的API,但仍然不能习惯在头文件中指定API版本.它似乎不是非常用户友好.

有没有办法让版本成为网址的一部分?

示例是:

http://domain.com/api/v1/action
Run Code Online (Sandbox Code Playgroud)

在我的情况下甚至更好:

http://api.domain.com/v1/action
Run Code Online (Sandbox Code Playgroud)

谢谢

Mar*_*nez 14

您也可以使用Restify来定义您的版本:

var server = restify.createServer({
    name: 'myAPI',
    versions: ['1.0.0', '2.0.0']
});
Run Code Online (Sandbox Code Playgroud)

然后使用此中间件server.pre:

server.pre(function (req, res, next) {
    var pieces = req.url.replace(/^\/+/, '').split('/');
    var version = pieces[0];

    // only if you want to use this routes:
    // /api/v1/resource
    // /api/v1.0/resource
    // /api/v1.0.0/resource
    if (!semver.valid(version)) {
        version = version.replace(/v(\d{1})\.(\d{1})\.(\d{1})/, '$1.$2.$3');
        version = version.replace(/v(\d{1})\.(\d{1})/, '$1.$2.0');
        version = version.replace(/v(\d{1})/, '$1.0.0');
    }

    if (semver.valid(version) && server.versions.indexOf(version) > -1) {
        req.url = req.url.replace(version + '/', '');
        req.headers['accept-version'] = version;
    }

    return next();
});
Run Code Online (Sandbox Code Playgroud)

最后,在您的路线中,您可以执行以下操作:

server.get({ path: '/resource/:id', version: '1.0.0' }, function () {
  // send object in version 1.0.0
});

server.get({ path: '/resource/:id', version: '2.0.0' }, function () {
  // send object in version 2.0.0
});
Run Code Online (Sandbox Code Playgroud)

例子:

以上示例遵循标准,因为如果未通过标头或URL指定版本,则显示最后一个版本.

更新:

我制作了一个插件,在URL中有API版本:https: //www.npmjs.com/package/restify-url-semver