12

ノードとエクスプレスを使用しています。コントローラーを登録するには、次のように呼び出します。

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

しかし、私はrfc-6570の方法でそれをしたいと思います:

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

私はグーグルコードでpythonの実装だけをグーグルで検索しましたが、JavaScriptの場合は何も見つかりませんでした( http://www.snellspace.com/wp/?p=831へのグーグルコードのデッドリンクを除く)。

一般に、URI テンプレートの作成は一見しただけでは簡単ではありません。RFC の例を見てください。

PS: クライアントにも URI テンプレートが必要です。

4

3 に答える 3

7

http://code.google.com/p/uri-templates/wiki/Implementationsの実装リストをクリーンアップしてきました- https://github.com/marc-portier/uri-に JS があります。のテンプレートですが、それが RFC を実装しているかどうかも、その品質もわかりません。

ここでテストの公開を開始したことに注意してください: https://github.com/uri-templates/uritemplate-test

したがって、確認したい場合は、そこから始めることができます。

于 2012-05-17T06:44:34.003 に答える
4

2014 年 6 月の時点で、これらの JavaScript 実装は最も完成度が高く (仕様のレベル 4)、テスト済みのようです。3 つすべてで、ブラウザーと node.js の両方もサポートされます。

于 2014-06-30T10:33:57.027 に答える
0

Express Router の部分に関しては、ハイパースキーマ内で uri テンプレートを使用することをお勧めします(続きを読む) ...

次に、express.js がサポートするルーターの正規表現を利用することもできます。パラメータの解決に関しては、 https://github.com/gerintluff/uri-templatesのような RFC 6570 実装が必要です ...

以下は、 RFC 6570 を使用してハイパースキーマを高速 js ルーターに変換するリライトを示す .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));
});
于 2015-10-30T18:55:28.037 に答える