parse nodejs node commander node.js routes restify

node.js - nodejs - Restificar: versión de API en URL



node js url (2)

La gente está en lo correcto al decir que no es compatible con restify, pero pensé que pondría mi solución a este problema en la mezcla. Estoy haciendo algo como esto (advertencia, código no probado a seguir):

Después de crear un servidor, pero ANTES de declarar las rutas, registro un analizador personalizado para traducir el especificador de versión de estilo url a un especificador de estilo HTTP:

server.use(versionParser);

Y versionParser.js se ve así:

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

De esta manera, las rutas restify pueden inspeccionar el encabezado Accept-Version como lo hacen naturalmente.

Nota : La parte inferior probablemente no sea relevante para esta respuesta, pero quería verificar que la versión de la API en la URL fuera un valor semver válido, ya que permite flexibilidad en los valores de URL para que un usuario pueda aprovechar la flexibilidad de restify en especificadores de versión.

Actualmente en desarrollo de API con restify y todavía no puede acostumbrarse a especificar la versión de API en los encabezados. Simplemente no parece muy fácil de usar.

¿Hay alguna forma de que la versión sea parte de la url?

Ejemplo sería:

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

O incluso mejor en mi caso:

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

Gracias


También puede usar Restify para definir sus versiones:

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

Y luego use este middleware con 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(); });

Finalmente, en tus rutas puedes hacer algo como esto:

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

Ejemplos:

Los ejemplos anteriores siguen los estándares, ya que si la versión no se especifica mediante encabezado o url, muestra la última versión.

ACTUALIZAR :

Creé un complemento para tener versiones de API en la URL: https://www.npmjs.com/package/restify-url-semver