2012-05-05 7 views
11

Sto usando il nodo ed esprimo. Per registrare un controller che io chiamo:: Esiste un'implementazione rfc-6570 in javascript?

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

Ma vorrei farlo nel modo rfc-6570:

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

Ho cercato su google solo un'implementazione in Python su Google Code, ma non trovò nulla (tranne i morti link su google code a http://www.snellspace.com/wp/?p=831) per JavaScript.

I modelli di URI in generale non sono così semplici come sembra a prima vista. Dai un'occhiata agli esempi nella RFC.

PS: Avrò bisogno anche dei modelli URI sul client.

+0

Questo RFC è a soli due mesi di vita; Non sarei sorpreso se non ci fossero implementazioni conformi per un po '... – maerics

+0

Per curiosità, perché vuoi usare quella RFC invece del modulo fornito da Express? – maerics

+0

Per prima cosa, rfc ha solo 2 mesi. Ma le bozze hanno circa 3 anni. – afx

risposta

7

Sto pulendo l'elenco delle implementazioni a http://code.google.com/p/uri-templates/wiki/Implementations - c'è uno JS a https://github.com/marc-portier/uri-templates ma non sono sicuro se implementa la RFC, né di quale sia la sua qualità.

noti che abbiamo iniziato le prove editoriali qui: https://github.com/uri-templates/uritemplate-test

Quindi, se si desidera controllare, si potrebbe cominciare da lì.

+0

Grazie! Integrerò i test durante l'implementazione. Il lavoro di marc portier va bene, ma può solo analizzare un modello ed estenderlo a un URI. Ma la parte difficile è estrarre le variabili di un dato URI con un uriTemplate. Come hai scritto nell'ultimo paragrafo 1.5 in rfc: "Alcuni modelli URI possono essere usati al contrario allo scopo della corrispondenza della variabile : confrontare il modello con un URI completamente formato per estrarre le parti variabili da quell'URI e assegnarli alle variabili nominate . " – afx

+0

@afx Lo hai implementato da qualche parte? Mi piacerebbe fare qualcosa di simile e dovrò crearne uno, ovunque posso unirmi? – Almad

+0

@afx Spiacente, in qualche modo mi manchi che tu sia probabilmente fxa da github;) – Almad

4

A partire da giugno 2014, queste implementazioni di JavaScript sembrano più complete (livello 4 della specifica) e tested. Tutti e tre supportano anche il browser e node.js.

0

Per quanto riguarda la parte del router espresso Suggerirei utilizzare i modelli uri all'interno di un hyperschema (read more) ...

Quindi potresti anche trarre vantaggio dalla regex per il tuo router che supporta express.js. Per quanto riguarda risolvere i parametri hai bisogno di un RFC 6570 di attuazione come https://github.com/geraintluff/uri-templates ...

Ecco il codice js per illustrare la riscrittura di un hyperschema UTILIZZO RFC 6570 per convertirlo in un router espresso 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)); 
}); 
Problemi correlati