RESTfulアーキテクチャの設計手法

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リクエストを送信します:

  1. POSTメソッドのフォームを作成する
  2. フォーム内に_methodパラメータを含める
  3. _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として処理されます。

タグ: spring-framework restful HTTP web-development API-design

7月4日 19:38 投稿