Restify:URL中的API版本
目前正在使用restify进行API开发,仍然不能习惯在头文件中指定API版本。 它只是不太友好的用户界面。
版本是否有任何方式成为url的一部分?
例子是:
http://domain.com/api/v1/action
或者在我的情况下更好:
http://api.domain.com/v1/action
谢谢
你也可以使用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 });
例子:
- http://api.domain.com/resource/10
- http://api.domain.com/2.0.0/resource/10
- http://api.domain.com/1.0.0/resource/10
上面的例子遵循标准,因为如果版本没有通过头或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的灵活性版本说明符。