Hatena::ブログ(Diary)

Mi manca qualche giovedi`? このページをアンテナに追加 RSSフィード Twitter

2008-06-14 URI Templates の各言語実装

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 Pythondraft-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。
  • 次のステータスにいつ頃進みそうか、などは不明( ietfURI 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+α(デフォルト値とか) のサブセットを作って欲しいなあ。

kunitkunit 2008/06/16 11:41 PHPも既にPEARパッケージがあるみたいですね。しかもdraft-03対応済みらしいです。

http://pear.php.net/package/URI_Template/download/

今晩にでも中身をみてみます。

n_shuyon_shuyo 2008/06/16 11:48 おーありがとうございます。
テストコードを見る限り、確かに draft-03 に対応してそうですね〜
一覧に加えさせてもらいますです。感謝

kunitkunit 2008/06/16 12:19 PHP版draft-03対応ですが、URIにtemplateをぶつけて、値を抜き出す処理がない・・・片手落ちすぎる

t-wadat-wada 2008/06/16 12:33 javascript には
http://www.snellspace.com/wp/?p=831
も、ありますね。draft-02 対応のようです。

n_shuyon_shuyo 2008/06/16 14:46 > 値を抜き出す処理がない
あいたた、そりゃ痛い。記事に書いた URI Templates のメリットが台無しだw

全然話は違いますが、「値を抜き出す処理」を実装によって extract と呼んだり match と呼んだりしていて意思疎通に困ってしまうので、DOM よろしくそこらへんも URI Templates 仕様で規定してくれたらいいんですけどね。

n_shuyon_shuyo 2008/06/16 14:47 > id:t-wada さん
ありがとうございます〜。加えておきます

nouvellelunenouvellelune 2008/06/17 23:15 .NETの日本語版
http://msdn.microsoft.com/ja-jp/library/system.uritemplate.aspx

n_shuyon_shuyo 2008/06/19 18:43 ありがとうございます〜日本語ページへのリンクも加えました。

IwamotoTakashiIwamotoTakashi 2008/06/25 22:20 Pythonのuri-templatesに他の実装のリンク集がありました。
http://code.google.com/p/uri-templates/wiki/Implementations

n_shuyon_shuyo 2008/06/27 19:57 ありがとうございます。追加しました。
意外と値抽出に対応していないものが多いんですよね……
あれ、そもそもの URI Template に extract は明記されちゃいないのか……???
本家は……本家の実装が draft-01 対応の物しか取得できなくなっている……?
うーん、今日は頭回らないので、ちょと保留。

s025236s025236 2012/07/27 18:30 はじめまして、JavaScriptで実装してみました。
http://d.hatena.ne.jp/s025236/20120727/p1
英語苦手なので取りこぼしがありそうですが、Lv1-4まで動いてるハズです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証


Connection: close