Restify:URL中的API版本

目前正在使用restify进行API开发,仍然不能习惯在头文件中指定API版本。 它只是不太友好的用户界面。

版本是否有任何方式成为url的一部分?

例子是:

http://domain.com/api/v1/action 

或者在我的情况下更好:

 http://api.domain.com/v1/action 

谢谢

       

网上收集的解决方案 "Restify:URL中的API版本"

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

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

然后用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(); }); 

最后,在你的路线中,你可以做这样的事情:

 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 }); 

例子:

上面的例子遵循标准,因为如果版本没有通过头或url指定,则显示最后一个版本。

更新

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

人们是正确的,它不支持restify,但我想我会把我的解决scheme解决这个问题的混合。 我正在做这样的事情(警告,未经testing的代码):

在我创build服务器之后,但是我声明路由之前 ,我注册了一个自定义分析器来将url风格的版本说明符转换为HTTP风格的说明符:

 server.use(versionParser); 

versionParser.js看起来像这样:

 var semver = require('semver'); var restify = require('restify'); module.exports = function (req, res, next) { // we expect every request to have the form "/api/[api-version]/..." // verify that the api-version is a valid semver value var urlPieces = req.url.replace(/^\/+/, '').split('/'); var api = urlPieces[0]; var apiVersion = urlPieces[1]; if (api !== 'api' || !semver.valid(apiVersion)) { return next(new restify.InvalidContentError({message: "Invalid Version Specifier"})); } req.header('Accept-Version', apiVersion); return next(); } 

这样,restify路由就可以检查Accept-Version头文件了。

旁注 :semver部分可能与此答案不相关,但我想validationURL中的API版本是一个有效的semver值,因为它允许URL值的灵活性,以便用户可以利用restify的灵活性版本说明符。