2012-05-05 10 views
11

Estoy usando node y express. Para registrar un controlador que llamo:plantillas de URI: ¿hay una implementación rfc-6570 en javascript?

app.get('/user/:id', function (req, res) {...}); 

Pero me gustaría hacerlo de la rfc-6570 manera:

app.get('/user/{id}', function (req, res) {...}); 

Busqué en Google sólo una aplicación en Python en Google Code, pero no encontré nada (excepto los muertos enlace en código de google a http://www.snellspace.com/wp/?p=831) para JavaScript.

La plantilla de URI en general no es tan fácil como parece a primera vista. Eche un vistazo a los ejemplos en el RFC.

PD: También necesitaré las plantillas URI en el cliente.

+0

que el RFC está a sólo dos meses de edad; No me sorprendería si no hay implementaciones compatibles por un tiempo ... – maerics

+0

Por curiosidad, ¿por qué quieres usar ese RFC en lugar de la forma que proporciona Express? – maerics

+0

Primero, el rfc tiene solo 2 meses. Pero los borradores tienen alrededor de 3 años. – afx

Respuesta

7

He estado limpiando la lista de implementaciones en http://code.google.com/p/uri-templates/wiki/Implementations - hay una JS uno en https://github.com/marc-portier/uri-templates pero no estoy seguro de si implementa la RFC, ni de su calidad.

Tenga en cuenta que hemos comenzado las pruebas editoriales aquí: https://github.com/uri-templates/uritemplate-test

Así que si quieres comprobarlo, se podría empezar por ahí.

+0

¡Gracias! Integraré las pruebas al implementar. El trabajo de marc portier está bien, pero solo puede analizar una plantilla y expandirla a un URI. Pero la parte difícil es extraer las variables de un URI determinado con uriTemplate. Como escribió en el último párrafo de 1.5 en el rfc: "Algunas plantillas de URI se pueden utilizar en sentido inverso para la variable haciendo coincidir: comparando la plantilla con un URI completamente formado para extraer las partes variables de ese URI y asígneles a las variables nombradas ". – afx

+0

@afx ¿Lo has implementado en alguna parte? Me gustaría hacer algo similar y también tendré que crear uno en cualquier lugar al que pueda unirme. – Almad

+0

@afx Lo siento, de alguna manera eché de menos que probablemente sea fxa de github;) – Almad

4

A partir de junio de 2014, estas implementaciones de JavaScript parecen más completas (Nivel 4 de la especificación) y tested. Los tres también son compatibles tanto con el navegador como con node.js.

0

En cuanto a la parte enrutador expresa Recomendaría para usar sus plantillas uri dentro de un hyperschema (read more) ...

Luego, también podría beneficiarse de la expresión regular de su enrutador, que es compatible con express.js. En cuanto a la resolución de los parámetros que necesita un RFC 6570 como aplicación https://github.com/geraintluff/uri-templates ...

Aquí hay un código js para ilustrar la reescritura de un hyperschema utilizando RFC 6570 para convertirlo en un enrutador expresa JS:

var hyperschema = { 
    "$schema": "http://json-schema.org/draft-04/hyper-schema", 
    "links": [ 
    { 
     "href": "{/id}{/ooo*}{#q}", 
     "method": "GET", 
     "rel": "self", 
     "schema": { 
     "type": "object", 
     "properties": { 
      "params": { 
      "type": "object", 
      "properties": { 
       "id": {"$ref": "#/definitions/id"} 
      }, 
      "additionalProperties": false 
      } 
     }, 
     "additionalProperties": true 
     } 
    } 
    ], 
    "definitions": { 
    "id": { 
     "type": "string", 
     "pattern": "[a-z]{0,3}" 
    } 
    } 
} 
var deref = require('json-schema-deref'); 
    var tv4 = require('tv4'); 
    var url = require('url'); 
    var rql = require('rql/parser'); 

// DOJO lang AND _ 
function getDottedProperty(object, parts, create) { 
    var key; 
    var i = 0; 

    while (object && (key = parts[i++])) { 
     if (typeof object !== 'object') { 
      return undefined; 
     } 
     object = key in object ? object[key] : (create ? object[key] = {} : undefined); 
    } 

    return object; 
} 
function getProperty(object, propertyName, create) { 
    return getDottedProperty(object, propertyName.split('.'), create); 
} 
function _rEscape(str) { 
    return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); 
} 

function getPattern(k, ldo, customCat) { 
    // ...* = explode = array 
    // ...: = maxLength 
    var key = ((k.slice(-1) === '*') ? k.slice(0,-1) : k).split(':')[0]; 
    var cat = (customCat) ? customCat : 'params'; // becomes default of customCat in TS 
    var pattern = ''; 
    if (typeof ldo === 'object' && ldo.hasOwnProperty('schema')) { 
    var res = getProperty(ldo.schema, ['properties',cat,'properties',key,'pattern'].join('.')); 
    if (res) { 
     console.log(['properties',cat,'properties',key,'pattern'].join('.'),res); 
     return ['(',res,')'].join(''); 
    } 
    } 
    return pattern; 
} 
function ldoToRouter(ldo) { 
    var expression = ldo.href.replace(/(\{\+)/g, '{') // encoding 
    .replace(/(\{\?.*\})/g, '') // query 
    .replace(/\{[#]([^}]*)\}/g, function(_, arg) { 
     // crosshatch 
     //console.log(arg); 
     return ['(?:[/]*)?#:',arg,getPattern(arg,ldo,'anchor')].join(''); 
    }) 
    .replace(/\{([./])?([^}]*)\}/g, function(_, op, arg) { 
     // path seperator 
     //console.log(op, '::', arg, '::', ldo.schema); 
     return [op,':',arg,getPattern(arg,ldo)].join(''); 
    }); 
    return {method: ldo.method.toLowerCase(), args:[expression]}; 
} 

deref(hyperschema, function(err, fullSchema) { 
    console.log('deref hyperschema:',JSON.stringify(fullSchema)); 
    var router = fullSchema.links.map(ldoToRouter); 

    console.log('router:',JSON.stringify(router)); 
}); 
Cuestiones relacionadas