URI模板:是否有javascript中的rfc-6570实现?

URI模板:是否有javascript中的rfc-6570实现?,javascript,node.js,express,uritemplate,Javascript,Node.js,Express,Uritemplate,我正在使用node和express。要注册我调用的控制器,请执行以下操作: app.get('/user/:id', function (req, res) {...}); 但我想这样做: 我在谷歌代码上用python搜索了一个实现,但没有找到JavaScript的任何东西(除了谷歌代码上的死链接) URI模板通常不像乍一看那么容易。看看RFC中的示例 PS:我也需要客户端上的URI模板。我一直在清理中的实现列表-中有一个JS,但我不确定它是否实现了RFC,也不确定它的质量如何 请注意,我

我正在使用node和express。要注册我调用的控制器,请执行以下操作:

app.get('/user/:id', function (req, res) {...});  
但我想这样做:

我在谷歌代码上用python搜索了一个实现,但没有找到JavaScript的任何东西(除了谷歌代码上的死链接)

URI模板通常不像乍一看那么容易。看看RFC中的示例


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

我一直在清理中的实现列表-中有一个JS,但我不确定它是否实现了RFC,也不确定它的质量如何

请注意,我们已开始在此处发布测试:


因此,如果您想检查它,您可以从那里开始。

截至2014年6月,这些JavaScript实现似乎最完整(规范的第4级)并且最简单。这三个版本都支持browser和node.js

  • npm安装模板
  • (也进行变量提取或替换):
    npm安装uri模板
  • URI.js:
    npm安装URIjs
    bower安装URI.js

关于express router part,我建议您在()中使用uri模板

然后,您还可以从express.js支持的路由器的regex中获益。 关于解析参数,您需要一个RFC6570实现,如

下面是一些.js代码来说明重写 使用RFC 6570将其转换为express js路由器:


RFC只有两个月大;如果有一段时间没有任何兼容的实现,我不会感到惊讶……出于好奇,为什么要使用RFC而不是Express提供的表单?首先,RFC只有2个月的历史。但是这些草稿已经有3年的历史了。其次,我想使用RFC方式,因为我在服务器上有一个混合环境:express和java/spring。Spring正在使用rfc样式(非常接近)。我想在spring和express中使用相同的模板——当然,在用户代理中也是如此。rfc方式比express/(ruby?)方式更具表现力。最后,如果没有实现,我将创建一个;-)非常感谢。我将在实现时集成这些测试。marc portier的工作很好,但它只能解析模板并将其扩展为URI。但困难的部分是使用uriTemplate提取给定URI的变量。正如您在rfc 1.5的最后一段中所写:“一些URI模板可以反向使用,用于变量匹配:将模板与完全格式的URI进行比较,以便从该URI中提取变量部分,并将其分配给命名变量。”@afx您在某处实现了它吗?我想做类似的事情,并且必须在我可以加入的任何地方创建一个?@afx抱歉,不知何故错过了您可能是github的fxa;)感谢@afx开发此库!:)
app.get('/user/{id}', function (req, res) {...});
  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));
});