RESTサポートの強化 -POSTオーバライドメソッドのサポート-


T2でRESTライクな通信のサポートを強化しました.
近代的なWebフレームワークにはRESTライクな通信のサポート機能がついていますが、
特にブラウザ上からの普通のサブミットではPUT/DELETEは通らないので結構悩ましい問題です.
HTML5で状況が変わりそうですが、それもしばらくかかりそう.


一番使われている技法は、パラメータに"_method"という指定をすることで擬似的にフレームワーク内で
HTTPメソッドを使った何らかの処理を切り替える方法で、特にPOSTを使って、PUT/DELETEをあらわすところから
POSTオーバーロードメソッドと言われています.書籍RESTful WebService参照.


もう一つの手法はHTTPヘッダを使う方法です.
GoogleとかMSのWCFとかはこの手法をつかっていて、HTTPヘッダにX-HTTP-Override-MethodというキーでHTTPメソッドをつっこんでおくと、切り替えれます.こちらはRESTからというよりは、企業内ユースだとファイアウォールでPUTが大体超えられないからという背景の影響です.


T2でもこれらを使って、Pageクラスで呼び出されるアクションメソッド(POSTでリクエストされてるけど、Pageクラスの@PUTのメソッドを呼び出すとか)を切り替えれるようにしました.
以下の順番です.

  • X-HTTP-Override-Methodをみて、適切なHTTPメソッドが入っていればHTTPメソッドオーバライドとみなす
  • リクエストパラメータに"_method"というキーで適切なHTTPメソッドが入っている場合、以下のチェックをする
    • HTTP POSTの場合、"_method"の値がPUT/DELETE/HEADであればHTTPメソッドオーバライドとみなす
    • HTTP GETの場合、"_method"の値がHEADであればHTTPメソッドオーバライドとみなす
  • それ以外は特にオーバライドなしの通常リクエストとみなす

SNAPSHOTを作ったので以下からどうぞ.依存ライブラリとかは変更ありません.