URI模板:在JavaScript中是否存在rfc-6570实现?

我正在使用节点和expression。 要注册一个控制器我打电话给:

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

但是我想用rfc-6570的方式来做:

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

我在Google代码上search了一下python的实现,但是没有发现任何东西(除了google代码上的链接到http://www.snellspace.com/wp/?p=831 )。

一般来说,URI模板并不像看起来那么简单。 看看RFC中的例子。

PS:我也需要客户端上的URI模板。

我一直在清理http://code.google.com/p/uri-templates/wiki/Implementations上的实现列表 – 在https://github.com/marc-portier/uri-模板,但我不确定它是否实现RFC,也不知道它的质量。

请注意,我们已经开始在这里发布testing: https : //github.com/uri-templates/uritemplate-test

所以,如果你想检查它,你可以从那里开始。

截至2014年6月,这些JavaScript实现似乎是最完整的(规范4级)并经过testing 。 所有这三个也支持浏览器和node.js。

  • fxa / uritemplate-js : npm install uritemplate
  • geraintluff / uri-templates (也是可变提取又名de-substitution): npm install uri-templates
  • URI.js 包括URI模板 : npm install URIjs或者bower install uri.js

关于快速路由器的一部分,我会build议在一个hyperschema中使用你的uri模板( 阅读更多 )…

那么你也可以从express.js支持的路由器获得正则expression式。 关于解决的参数,你需要一个像RFC 6570实现像https://github.com/geraintluff/uri-templates

下面是一些.js代码来说明重写一个hyperschema使用RFC 6570将其转换为一个快速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": "[az]{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)); });