2012-05-05 32 views
11

Używam węzła i ekspresowe. Aby zarejestrować kontroler zadzwonić:Szablony URI: Czy istnieje implementacja rfc-6570 w javascript?

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

Ale chciałbym zrobić to rfc-6570 sposób:

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

google tylko wdrożenie w Pythonie na kod google, ale nic nie znalazłem (oprócz zmarłych link do kodu google do http://www.snellspace.com/wp/?p=831) dla JavaScript.

Projektowanie szablonów URI nie jest tak łatwe, jak wygląda na pierwszy rzut oka. Rzuć okiem na przykłady w RFC.

PS: Potrzebne będą również szablony URI na kliencie.

+0

to RFC jest tylko dwa miesiące; Nie byłbym zaskoczony, gdyby nie było żadnych zgodnych implementacji przez chwilę ... – maerics

+0

Z ciekawości, dlaczego chcesz używać tego RFC zamiast formularza, który zapewnia Express? – maerics

+0

Po pierwsze, rfc ma tylko 2 miesiące. Ale szkice mają około 3 lat. – afx

Odpowiedz

7

Czyściłem listę implementacji pod numerem http://code.google.com/p/uri-templates/wiki/Implementations - istnieje JS w wersji https://github.com/marc-portier/uri-templates, ale nie jestem pewien, czy implementuje on specyfikację RFC, ani jaka jest jej jakość.

Zauważ, że zaczęliśmy testy wydawniczych tutaj: https://github.com/uri-templates/uritemplate-test

Więc jeśli chcesz to sprawdzić, można tam rozpocząć.

+0

Dziękujemy! Będę integrować testy podczas wdrażania. Praca marc portiera jest dobra, ale może tylko parsować szablon i rozszerzyć go do URI. Ale trudną częścią jest wyodrębnienie zmiennych danego URI za pomocą uriTemplate. Jak napisałeś w ostatnim akapicie 1.5 w rfc: "Niektóre szablony URI mogą być używane w odwrotnej kolejności w celu zmiennej dopasowywania: porównywania szablonu do w pełni ukształtowanego URI w celu uzyskania ekstraktu zmiennych części z tego URI i przypisz je do nazwanych zmiennych . " – afx

+0

@afx Czy wprowadziłeś go gdzieś? Chciałbym zrobić coś podobnego i będę musiał je stworzyć, gdziekolwiek się przyłączę? – Almad

+0

@afx Przepraszam, jakoś brakowało ci prawdopodobnie fxa z github;) – Almad

4

Od czerwca 2014 te implementacje JavaScript wydają się być najbardziej kompletne (poziom 4 specyfikacji) i tested. Wszystkie trzy obsługują również przeglądarkę i node.js.

0

odniesieniu do wyraźnego części routera Polecam do używania szablonów uri w ramach hyperschema (read more) ...

Następnie możesz również skorzystać z wyrażenia regularnego dla routera, który obsługuje express.js. chodzi rozwiązywania parametry musisz RFC 6570 realizację podobnego https://github.com/geraintluff/uri-templates ...

Oto kod js do zilustrowania przepisanie na hyperschema USING RFC 6570, aby przekształcić go do routera wyraźnego 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)); 
}); 
Powiązane problemy