2012-05-05 7 views
11

私はnodeとexpressを使用しています。死者を除いて(私はGoogleのコード上のpythonでちょうど実装をグーグルが、何も見つからなかったURIテンプレート:javascriptにrfc-6570の実装はありますか?

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

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

しかし、私はそれをrfc-6570方法をやりたい:私は呼んでコントローラを登録するにはGoogleのコードをhttp://www.snellspace.com/wp/?p=831にリンクしてください)。

URIテンプレートは一般的には見た目ほど簡単ではありません。 RFCの例を見てください。

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

+0

。しばらくの間、準拠した実装がないと私は驚いてはいません... – maerics

+0

好奇心のために、なぜExpressが提供するフォームの代わりにRFCを使用したいのですか? – maerics

+0

まず、rfcはわずか2ヶ月です。しかし、ドラフトは約3歳です。 – afx

答えて

7

http://code.google.com/p/uri-templates/wiki/Implementationsの実装リストを整理しています - https://github.com/marc-portier/uri-templatesにJSがありますが、それがRFCを実装しているのか、その品質が実装されているのか分かりません。私たちはここにテストを公開し始めました

注: https://github.com/uri-templates/uritemplate-test

あなたがそれを確認したいのであれば、あなたはそこに開始することができます。

+0

ありがとう!私は実装時にテストを統合します。 marc portierの作業は問題ありませんが、テンプレートを解析してURIに展開することしかできません。しかし、難しいのは、uriTemplateを使ってURIの変数を抽出することです。 rfcの1.5の最後の段落で書いたように、「 という変数の目的のために逆のURIテンプレートを使用することができます。 そのURIから可変部分を抽出するためにテンプレートを完全に形成されたURIと比較し、それらを変数「 」に割り当てます。 – afx

+0

@afxどこかに実装しましたか?私は同様のことをしたいと思うし、どこにでも私が参加することができるようにも作成する必要がありますか? – Almad

+0

@afx申し訳ありませんが、あなたがおそらくgithubからfxaであることを見逃しました;) – Almad

4

2014年6月現在、これらのJavaScript実装は最も完全なもの(仕様のレベル4)とtestedと思われます。これらの3つは、ブラウザとnode.jの両方をサポートしています。

0

hyperschemaread more)内にあなたのuriテンプレートを使用する...

また、express.jsでサポートされているルータ用のregexのメリットもあります。 あなたがhttps://github.com/geraintluff/uri-templatesのようなRFC 6570の実装を必要とするパラメータを解決について...ここ

は明示jsのルータにそれを変換するために、RFC 6570を使用したhyperschema の書き換えを説明するためにいくつかの.jsコードです:

RFCは、わずか2ヶ月であることを
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)); 
}); 
関連する問題