1. RESTfulスタイルとは
RESTfulスタイルを理解するには、以下の2つの重要な概念を把握すれば足够了。
1.1 統一されたインターフェース
REST(Representational State Transfer)はHTTPプロトコル上に構築されたアーキテクチャスタイルです。データの基本操作(CRUD)は、それぞれ対応するHTTPメソッドにマッピングされます:
- GET:サーバーからリソースを取得する(単一または複数)
- POST:サーバーに新しいリソースを作成する
- PUT:サーバーリソースを更新する(クライアントが完全リソースデータを提供)
- PATCH:サーバーリソースを部分的に更新する(変更が必要なデータのみ提供)
- DELETE:サーバーからリソースを削除する
この方式により、データ操作のインターフェースが統一され、HTTPメソッドだけでデータの作成・取得・更新・削除のすべての操作が可能になります。
1.2 URI(Uniform Resource Identifier)の設計
URIは、特定のリソースを識別するための識別子です。各URIは特定のリソースに対応し、そのURIにアクセスすることで対象のリソースを取得できます。
原則として、各リソースは少なくとも1つのURIを持ちます。最も代表的なURIはURL(Uniform Resource Locator)です。
2. URLとURIの違い
HTTPプロトコルの、より詳細な理解が必要です:
- URLの形式:プロトコル://ドメイン/パス?クエリ#ハッシュ。実際のHTTPリクエストには、Header(Cookie、Method等)も含まれます
- リソースのURI形式:プロトコル://ドメイン/パス。URLのサブセットであり、リソースの実体を表します(例:
http://api.example.com/employees/1)
3. 実装サンプル
「リソース」に対するリクエストの記述例を示します。実際のビジネス要件に応じて実装してください。
フロントエンド(JSP):
<%
String contextPath = request.getContextPath();
%>
コンテキストパスはcontextPath変数に格納されます。リクエスト例:/employees/${employeeId}
バックエンド(Spring Controller):
@RequestMapping(value = "/employees/{employeeId}", method = RequestMethod.GET)
public String getEmployee(@PathVariable("employeeId") Integer id, Model model) {
// 取得ロジック
}
直接アクセスによるテスト:
フロントエンドを介さず、アドレスバーで以下を入力してサーバーにアクセスできます:
localhost:8080/employees/1
これにより、1番の従業員情報を取得できます。
4. RESTfulの4つのメソッド実装
HTTPプロトコルでは標準でGETとPOSTのみサポートされていますが、PUTとDELETEも使用可能です。Spring Frameworkでは、Restスタイルのサポートを提供するフィルターが組み込まれています。
HiddenHttpMethodFilterの設定
web.xmlに以下のフィルター設定を記述します:
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
フォームの実装
フィルター設定後、ページ側で以下の形式でPOSTリクエストを送信します:
- POSTメソッドのフォームを作成する
- フォーム内に
_methodパラメータを含める _methodの値をDELETEまたはPUTに設定する
更新用フォーム:
<form action="products/1" method="post">
<input name="_method" value="put"/>
<input type="submit" value="1番商品を更新"/>
</form>
削除用フォーム:
<form action="products/1" method="post">
<input name="_method" value="delete"/>
<input type="submit" value="1番商品を削除"/>
</form>
この設定により、POSTリクエストでありながら、サーバー側ではPUTまたはDELETEとして処理されます。