Playで体得するRESTfulアーキテクチャの基礎知識:Javaの常識を変えるPlay framework入門(5)(3/3 ページ)
サーブレット/JSPを基にする重厚長大なJavaのWeb開発のイメージを変える軽量フレームワーク「Play」について解説し、Webアプリの作り方を紹介する入門連載。今回は、RESTの概要、URIの概念、RESTで使われるHTTPメソッドとステータスコード、PlayでのRESTfulな設計、実装上の問題点などを解説します。
実装上の問題点(クライアントサイド)
「では、実際にRESTfulなシステムを構築してみよう」と思わせてしまったかもしれませんが、実は問題があります。
というのも、現在のWebブラウザではHTMLのFORMタグのmethodは「GET」と「POST」のみ許可していて「PUT」や「DELETE」を標準でサポートしていないものがほとんどだからです。なのでRESTfulになるようシステム設計を忠実に守ろうとした場合、現状ではJavaScriptを用いて「PUT」や「DELETE」を送信するなどの手段を取らなければいけません。
ここからは、Play frameworkが用意しているJavaScriptライブラリより「PUT」や「DELETE」の送信方法を見てみましょう。
jQueryを使った例
Play frameworkでは「public」フォルダの下の「javascripts」フォルダにJavaScriptライブラリの「jQuery」が用意されています。
jQueryの細かい使い方については、ここでは割愛します。jQueryについて詳細を知りたい方は@ITの記事を参照してください。
ここでは、簡単に「PUT」を送る例を下記に示します。
<!DOCTYPE html> <html> <head> <!-- 【1】 jQueryライブラリの呼び出し --> <script type="text/javascript" src="@routes.Assets.at("javascripts/jQuery-1.7.1.min.js")" ></script> <script type="text/javascript"> function doPUT(){ $(document).ready(function(){ // 送信先のURL の取得 var targetURL = getTargetURL(); // Formデータの取得 var formData = getFormData(); // 【2】 「PUT」送信 $.ajax({ type: 'PUT', // HTMLメソッド url: targetURL, // 送信先のURL data: formData, // 送信するデータ success: function(){ // 送信成功時の処理 alert('成功しました。'); } }); }); } function getTargetURL(){ ……略 } ……略 </script> ……略 </head> <body> <form method="POST"> …… 略 <!-- 【3】JavaScriptの呼び出し --> <input type="submit" value="更新" onClick="javascript:doPUT();"/> </form> </body> </html>
簡単に上記のポイントを説明していきます。
- 【1】jQueryライブラリの呼び出し
Play frameworkで用意されているjQueryを宣言します。jQueryのバージョンについてはPlay frameworkによって変わることがあるので注意してください。
- 【2】$.ajaxメソッド
Ajax通信を行うメソッドです。TypeにHTMLメソッドを指定します。今回は「PUT」メソッドを使ってFormデータを指定したURLに送信しています。
- 【3】JavaScriptの呼び出し
ボタンを押したときにJavaScriptのdoPUT()メソッドを呼ぶようにしています。
このように、JavaScriptなどの技術を用いて「PUT」や「DELETE」などWebブラウザがデフォルトで対応していないHTMLメソッドを送信できることはできます。
しかし「PUT」や「DELETE」などを呼ぶためだけにJavaScriptを使うなどの手間が発生してしまいます。全体的にうまく設計しないと、このような余計な手間は開発効率も悪くなりますし、バグが発生する可能性が高くなります。
ですので、RESTの原則から外れてしまいますが、個人的には更新や削除も「POST」で更新や削除のフラグを渡すなどで行う方が現実的かと思います。
実装上の問題点(サーバサイド)
これで、頑張ればクライアントから「PUT」や「DELETE」の送信をできることは分かりましたが、まだ問題があります。
それは、サーバによっては「GET」「POST」以外のHTMLメソッドを受け付けない設定になっている場合があることです。この場合、クライアントでどんなに頑張っても、サーバ側で拒否されてしまうので、「GET」「POST」送信で更新や削除の処理を行うのは仕方がないと思っています。
ですので、最初のRESTでの説明では「GETやPOSTで読み込みや更新や削除など全てやってしまうシステムはREST的ではありません」と書きましたが、現状、この「PUT」「DELETE」送信に関してはRESTfulでない方がより良い解決策かと思います。
無理にサポートされていないHTTPメソッドを送信するための無駄な処理を追加する必要がなくなるので、「PUT」や「DELETE」の代わりに「POST」での送信の方が良いでしょう。イメージとしては以下の2つの送信方法を分ける方が現実的かと思います。
- 「GET」はリソースの指定もしくは検索などリソースに変化を与えない処理
- 「POST」はリソースの変更、追加、削除などリソースの状態を変える処理
次回はPlay frameworkで行う“テスト”について
さて、最後に現状のWebブラウザでのHTTPメソッドに対する制限があり、完全なRESTfulなシステムのは現実的ではないことも分かりましたが、それを差し引いてもRESTはシステムアーキテクチャのパターンとしてはシンプルで使いやすいパターンであるかと思います。
今回はPlay frameworkが得意とするRESTの利点を生かしたシステム構築パターンについて学びました。次回はPlay frameworkで行うテストについて紹介しますので、楽しみにしてください。
著者プロフィール
長谷川 智之(はせがわ ともゆき)
2008年より、株式会社ビーブレイクシステムズに在籍。
基本的にはどんな問題があるか分からない新しい技術より、問題点をクリアした使い慣れた技術の方を好む保守派。しかし、最近のヤングでナウな新世代の考えに乗り遅れてきたため、新しい技術にも手を出し始める
Copyright © ITmedia, Inc. All Rights Reserved.