« LAMP | メイン | AnnotationとPOJO »
2005年06月21日 (火)
RESTful Web Applicationの可能性 [テクニカル]
RESTについて、前に先輩のsatoshi氏と話をしていたのだが、共通の感想が「WebブラウザからPUT, DELETEメソッドが使えればいいのに…」ということだった。HTML form要素のmethod属性は、仕様として"GET"と"POST"しか許されていない。
そこでPUT, DELETEなしでWebアプリケーションのURI設計をするとしたらどうなるかなと思い、ちょっと調べてみると、W3CでXFormsという規格があり、他のメソッドも使えるようになっている。XFormsは複雑すぎるということからWeb Forms 2.0という規格も提案されている。
そういえば、最近流行りのAjaxのXMLHttpRequest使ったらできるんじゃないの?
と思って、適当なhtmlファイルを作って試してみたら、見事にIEとFirefoxの両方でPUTもDELETEも成功!(任意のメソッドOK) すばらしい。スクリプト必須ではあるが、現時点でもRESTfulアプリケーションの可能性が見えてきた。
参考リンク:
HTML 作成者のための XForms 入門
Web Forms 2.0 Working Draft
ちなみに作ったhtmlはこんなの。
<script language="javascript" type="text/javascript">
function createXMLHttpRequest() {
return this.XMLHttpRequest ?
new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
}
var req = createXMLHttpRequest();
function send_request(method) {
req.open(method, "httpmethod.html", true)
req.send(null)
}
</script>
<input type="button" value="GET" onclick="send_request('GET')"/>
<input type="button" value="POST" onclick="send_request('POST')"/>
<input type="button" value="PUT" onclick="send_request('PUT')"/>
<input type="button" value="DELETE" onclick="send_request('DELETE')"/>
なぜかIEでGETとPOSTだけ成功しなかったのだが、たぶんコードの書き方がどこかおかしいのだろう。GETとPOSTなら普通のフォームでできるし。
Web ApplicationをRESTfulに近づけていくことで、Web Serviceとの垣根をなくす方向を目指したい(すでに一部のBlogシステムはそれに近い)。そのためにはRESTを意識したWeb Application Frameworkが必要。
アプリケーション内部のデータ(コンテンツ?)をすべて統一的な形(XML?)で定義できるようにし、すべてをリソースとみなしてURIを与える。プログラム内でも基本的にそのリソース識別子によってアクセスする。
すべてのデータがXMLもしくはHTMLで定義できるのであれば、それをプログラムで直接扱える形としてのオブジェクトと相互変換することが必要。Object-XMLマッピングの領域。O/R Mappingの技術に近く、実装にアノテーションなどの技術が使えそう。概念的にCMSに近いものになってきそうな気もする。
しかし、Roy Fielding曰く、『Web がうまく機能したのはシステムのインターフェースに object-specific な属性を採用しなかったことにあると僕は考える。だからマーケティングキャンペーンが単にそう言っているからといって、object-specific な属性がWebアーキテクチャの一部になることを許すのは、バカげているだけでなく、私たちが懸命に作ろうとしているシステムの未来に反している』。
んー、つまりWebの世界をOOでラップするのはやめれってことじゃないのかなぁ。僕の言っているのは、レイヤーの境界ではいちいち変換しろってことだから、Fielding氏の主張には反してないと思うのだが。
ほんとうは元の論文を読むべきなんだけど、英語なのでちょっとつらい。。。
メモ:「リソース指向」と「アクティビティー指向」という言葉を使って相違点を探る記事。
http://www-6.ibm.com/jp/developerworks/webservices/041119/j_ws-restvsoap.html
トラックバック
このエントリーのトラックバックURL:
http://www.4bit.net/x/mt/mt-tb.cgi/65