現在、世の中に出回ってるWebシステムで使われているHTTPメソッドはGETもしくはPOSTで画面遷移から情報の更新や削除まで全て賄っているものがほとんどかと思います。
実際JSPとServletのWebシステムがはやり始めたころはdoGetもしくはdoPostメソッドのみの解説だった記憶があります(これはWebブラウザの制限もあるのですが、この制限については後述します)。
しかしHTTPメソッドはGETやPOST以外にもあり、それぞれのメソッドには意味があります。特に、RESTで使われると思われる主なHTTPメソッドは以下の4つです。
HTTPメソッド | 用途 |
---|---|
GET | リソースの取得(リソースに対する変更は行わない) |
POST | リソースの新規追加 |
PUT | リソースの更新 |
DELETE | リソースの削除 |
なので、例えば以下のようにGETでパラメータを渡して削除を要求して実行するようなシステムはREST的ではありません。
http://……/doAction?category=delete
また、HTTPでは処理に対する返答のステータスコードも定義されています。よくWebブラウザのURIを間違って入力した際に表示される「404 Not Found」も定義されているステータスコードの一例です。大まかな定義は以下のようになります。
200番台 | 正常時のコード。 |
---|---|
300番台 | リダイレクト時のコード |
400番台 | クライアント側でのエラー時のコード |
500番台 | サーバ側でのエラー時のコード |
以下、代表的なステータスコードを挙げておきます。
ステータスコード | 意味 |
---|---|
200 | OK。正常時のレスポンス |
302 | Found。リダイレクトする時のレスポンス |
401 | Unauthorized。承認失敗時のエラー |
403 | Forbidden。不正なアクセス時(権限がないなど)のエラー |
404 | Not Found。指定したURIにリソースがない時のエラー |
408 | Request Timeout。タイムアウト発生時のエラー |
500 | Internal Server Error。サーバで発生した予期せぬエラー |
503 | Service Unavailable。サーバがメンテナンスや高負荷などでリクエストを受け付けられない状態 |
RESTではリクエストの処理結果を定義されているリクエストコードに沿って返すことを原則としています。
さて、ここまでRESTについて紹介してきて、何かピンと来たものはないでしょうか? HTTPメソッドやURI設計などは本連載の前回記事で出てきた「routes」ファイルできれいにまとまる気がしませんか?
例えば今回の例に挙げたブログサイトなどをroutesファイルでまとめてみると、下記のようになります。
GET / controllers.Application.showAllList() ……【1】 GET /list/:year controllers.Application.showYearList(year:Integer) ……【2】 GET /list/:year/:month controllers.Application.showYearMonthList(year:Integer, month:Integer) ……【3】 GET /list/:year/:month/:day controllers.Application.showYearMonthDayList(year:Integer, month:Integer, day:Integer) ……【4】 GET /entry/:id controllers.Application.showBlog(id:Long) ……【5】 GET /new controllers.Application.showEditNewBlog() ……【6】 POST /new controllers.Application.insert() ……【7】 GET /edit/:id controllers.Application.showEditBlog(id:Long) ……【8】 PUT /edit/:id controllers.Application.update(id:Long) ……【9】 DELETE /edit/:id controllers.Application.delete(id:Long) ……【10】
※ 前回の記事でも紹介しましたがPlay frameworkでは「/xxx」と「/xxx/」は別物とみなされます。もし最後のスラッシュの有無にかかわらず同じリソースを指す場合は両方とも定義する必要があります。
上記のroutesファイルは以下のことを表現しています。
前回の記事でも説明しましたがroutesファイルでは以下のことが1行にまとめられて分かりやすくなっています。
GETでは表示を表し、POSTで登録を表し、PUTで更新を表し、DELETEで削除を表しているところがポイントです。
また、このパターンに従うとGETとその他を区別することによって、URIを入力しただけで本来は画面から行うことが前提の処理を防げるのもポイントの1つです。例えば【6】と【7】の場合と、【8】と【9】と【10】の場合になります。
今度は結果について見てみましょう。前述で、RESTではリクエストの処理結果を定義されているリクエストコードに沿って返すことを原則としていると書きましたが、Play frameworkでは、そのステータスコードに対応するものとしてResultsクラスを用意しています。このResultsクラスではステータスコードに該当するResults.Status(リダイレクト時がResult)を返すメソッドを用意しています。
これまでの本連載で、サンプルのControllerでよく記述していた下記のような処理が、それに該当します。実はControllerクラスは Resultを返すメソッドを用意したResults クラスを継承してます。
public static Result showSomething() { …… 略 return ok(……); }
先ほど挙げたステータスコードに対応するResultsクラスのメソッドは以下のようになります。
ステータスコード | 戻り値 | メソッド |
---|---|---|
200 | Results.Status | ok() |
302 | Result | found() |
401 | Results.Status | unauthroized() |
403 | Results.Status | forbidden() |
404 | Results.Status | notFound() |
500 | Results.Status | internalServerError() |
また任意のステータスコードを返せるメソッドも用意されています。
static Results.Status status(int status)
ここでは一番シンプルなメソッドを選び紹介しましたが、他のステータスコードに対応したメソッドやさらに詳細を知りたい方はPlay frameworkのAPIをご確認ください。
Copyright © ITmedia, Inc. All Rights Reserved.