URI Templates の各言語実装

今日は第3回 RESTful 読書会だった。主催の id:kunit さん&nsiena さん、担当の方々、参加者の皆さんお疲れ様でした〜。

読書会の模様(特に8章の DIS られっぷり)はまた今度まとめるとして。
この前 URI Templates ( http://bitworking.org/projects/URI-Templates/ ) の各言語の実装を調べたよと読書会で話したら、id:t-wada さんに「調査結果が addressable になるといいなーw」とリクエストされたので、早速宿題をやっつけておく。

URI Templates の実装一覧

本家 (experimental implementation in Python、
59:04+09:00">draft-03相当):http://code.google.com/p/uri-templates/
Ruby - Addressable
http://addressable.rubyforge.org/
Ruby (draft-02相当、値抽出無し)
http://github.com/juretta/uri-templates/tree/master
Javascript
http://www.mnot.net/javascript/url_template/
Javascript (draft-02相当、値抽出無し)
http://www.snellspace.com/wp/?p=831
Perl
http://search.cpan.org/~bricas/URI-Template/
.NET
http://msdn.microsoft.com/ja-jp/library/system.uritemplate.aspx (日本語)
http://msdn.microsoft.com/en-us/library/system.uritemplate.aspx (English)
PHP (draft-03相当、値抽出無し)
http://pear.php.net/package/URI_Template/download/
Java - Apache Abdera (draft-03相当、値抽出無し)
http://cwiki.apache.org/ABDERA/uri-templates.html
Java - Metanotion URLMapper (値抽出無し)
http://www.metanotion.net/software/urlmapper/
Erlang (実装に目を通していないので、対応状況は不明)
http://tfletcher.com/dev/erlang-uri-template
C++ (draft-01)
http://labs.cybozu.co.jp/blog/nakatani/2008/07/uri_template_c_xbyak_jit.html (日本語)
http://shuyo.wordpress.com/2008/07/17/jit-compiler-for-uri-templates-cxbyak/ (English)
  • "draft-**相当" と特筆されているもの以外は substitution のみの実装(おそらく draft-01 相当)
  • 他にもあったら教えてもらえると嬉しい
  • (6/16) PHP 版は id:kunit さんにコメント欄で教えていただいた。感謝
  • (6/16) draft-02 相当な JS 版は id:t-wada さんにコメント欄で教えていただいた。同じく感謝
  • (6/27) id:IwamotoTakashi さんに本家の実装リンク集を教えていただいて Java/Erlang/Ruby の情報を追加。感謝
  • (7/10) 手前味噌ですが、C++ 実装を追加

これで終わっちゃうのも何なので、URI Templates について簡単に紹介。

  • 値をテンプレートに埋め込んで URI を生成、逆に URI から値を取り出すための仕様
  • ietf で標準化を目指して仕様策定されている(はず)。
  • 現在の最新版は draft-03。
  • 次のステータスにいつ頃進みそうか、などは不明( ietf の URI ML までは追いかけたのだけど )

ブラウザからリクエストされた URI を解析して値を取り出したり、逆に値のセット(ハッシュ)から URI を生成することを考える。
URI Templates では、以下のような「テンプレート」を用意することで、それに値を入れて URI を得たり、逆に URI とマッチングさせて値を得たりする。

http://www.example.com/users/{userid}

REST における、記述的な URI を使った connectivity (リンク)を満たすアプリケーションを作成するとき、同じ URI を作り、またそれを解析する必要が生じるのだが、かたや正規表現で、かたや文字列連結で、ということだと間違いが発生する可能性は十分あるし、変更の時のメンテナンスも大変。
テンプレートを記述するだけでその両方に対応できたら問題は解決するよね、というのが URI Templates の利点だろうと思う。
クエリパラメータでしか値の受け渡しをしないとか、リンク URI に値を含めることはしない(メニューなどの静的なリンクしかない)とかいった場合はあまり役に立たないだろう、って言っちゃってもいいのかな?


draft-03 でしかないくせに、RESTful本の作者からは「HTML5 に入るかも」と(過度の?)期待を得ているのだが、実のところ draft-03 は結構プログラマブルだったりと無闇に高機能。
はっきりいってそこまでいらない。
draft-01+α(デフォルト値とか) のサブセットを作って欲しいなあ。