Rails4をはじめよう

2015年1月21日(水)
野田 貴子

【補足】RESTとは?

さてここからは、チュートリアルの補足的な話です。チュートリアルに「REST」という言葉がチラホラ出てきていたので、それについて解説したいと思います。RESTとは、狭義ではインターネット上の情報をやり取りする際の、URLの書き方やデータの返し方の決まりのことです。

一般的なWebアプリでは、URLがそのままフォルダとファイルの階層を表しているわけではありません。例えば「http://example.com /articles/1」というURLで記事IDが1の記事を参照できたとしても、example.comのサーバーにarticlesフォルダがあるとは限りません。どのURLをどの処理(プログラムのファイル)に対応させるかは、各Webアプリの設定次第です。極端な例を挙げれば、「http://example.com/heyhey/helloiamusingrubyonrails.html」というURLで、rubyfiles フォルダの中にあるprofile.rbというファイルを実行させることもできるわけです。Railsでは、どのURLをどの処理に対応させるのかを、 config/routes.rbファイルで簡単に設定することができます。これにより、特別なことをしなくともRESTful(RESTの仕様に 合った)なURLを使うことができます。

それでは、RESTの仕様とはどのようなものなのでしょうか。Webページを見たりブログを投稿したりするためには、ブラウザなどのクライアントからWebサーバーに対し「(a)何を」「(b)どうしたい」か、というリクエストを送っています。例えば、以下のようなものが考えられます。

  • (a)投稿者のプロフィールを(b)見たい
  • (a)記事の一覧を(b)見たい
  • (a)新しい記事を(b)作成したい(○○という内容で)
  • (a)記事IDが1の記事を(b)見たい
  • (a)記事IDが1の記事を(b)更新したい(○○という内容で)
  • (a)記事IDが1の記事を(b)削除したい

これらの「(a)何を」にあたるものがURLであり、「(b)どうしたい」にあたるものが、「GET」や「POST」などの「HTTPメソッド」です。HTTPメソッドは普段目につくところには表示されないので、一般のユーザーは意識することはないでしょう。HTTPはそれぞれ使い道が決まっていますが、ルールを破って使うこともできます。例えば「投稿者のプロフィールを『見たい』」というリクエストに対し、「一番新しい記事を『削除する』」という処理を実行させることもできるわけです。しかしそのようなWebアプリは、とても問題があります。HTTPの仕様に合わせることはもちろん、さらにはRESTの仕様にも合わせて開発することが望ましいと言えるでしょう。Railsでも使用される基本的なHTTPのメソッドを紹介していきます。

GET

基本的なルール

GETは「見たい」で、最もよく使われます。ブラウザのURLバーにURLを入力したり、通常のリンクをクリックしたりした際には、ブラウザがGETを使ってリクエストを送信します。GETでは、サーバーにあるデータを更新してはいけません(アクセスログが更新されたりするのは別として……)。

RESTのルール

REST では、同じデータに対し同じURLでGETをすると、同じ結果が返ってくることが想定されています。「何を見たいか」の情報は、すべてURLに入れます。 「?」以降の情報を「パラメータ」と言い、「&」で複数のパラメータを連結することができます。各パラメータは「キー=値」の形式になっています。

GET http://example.com/articles/search?keyword=sky&category=1&from=20140101&to=20141231
「(a)キーワードがsky、カテゴリーIDが1で2014年1月1日から2014年12月31日に投稿された記事の検索結果を」「(b)見たい」

また、あるグループに属するデータの一覧を見るためのURLがあったとしたら、その中の1つを見るためには、そのURLの下の階層にIDを付けるようにするのも、RESTの仕様です。

GET http://example.com/articles
「(a)記事の一覧を」「(b)見たい」
GET http://example.com/articles/1
「(a)記事IDが1の記事の内容を」「(b)見たい」

POST

基本的なルール

サーバーにあるデータを更新する際に使います。掲示板にコメントを記入して送信ボタンを押した時、画面を再読み込みしようとすると「もう一度送信しますか?」のようなアラートが出ますよね。大抵の場合、あれがPOSTで送っているという証拠です。POSTでは、パラメータをURLに含まずに送信できます。どのような内容で更新するかの情報はURLには含まず、こっそり(?)送られます。もしURLに更新内容が含まれていたら、どうなるでしょう? そのURLのリンクが誰でも見られる掲示板などに貼られると、第三者がリンクをクリックしただけで意図しない更新処理が実行されてしまいます。これは問題ですよね。

POST http://example.com/articles/add.php
POSTパラメータ title=hello&body=This%20is%20a%20test.
(a)新しい記事を(b)作成したい(titleは「hello」、bodyは「This is a test.」という内容で)

以下の例は、間違った使い方です。

GET http://example.com/articles/add.php?title=hello&body=This%20is%20a%20test.

POSTリクエストは、実行した回数だけサーバー側のデータが更新される処理です。例えば同じ内容で記事の作成処理を2回実行すると、同じ内容の記事が別々に2つ 作成されます。これに対し記事の更新では、更新する対象の記事が決まっているので、同じ内容で記事の変更処理を2回実行しても、1回目も2回目も結果は同じになります。同じデータに対して何度同じ処理をしても結果が同じものを「べき等(べきとう)である」といいます。GETはべき等な処理ですが、POSTは実行するたびにデータが増えていく「べき等でない」処理です。ただ、べき等になる処理であっても、POSTで処理している間違った実装をしているものもあります。

以下の例は、(1)本来GET(見たい)であるべきなのにPOST(更新したい)を使っている、(2)URLが同じなのに検索条件が異なるので、検索結果が違ってしまうの2点で間違った使い方です。

POST http://example.com/articles/search
POSTパラメータ keyword=blue
POST http://example.com/articles/search
POSTパラメータ keyword=sky&category=1&from=20140101&to=20141231

RESTのルール

RESTでは、さらに厳密にPOSTを定義しています。新しい記事を作成する場合はPOSTを使用し、新しい記事のIDはサーバー側で決定されます。

POST http://example.com/articles

この記事をGETで参照する際のURLは、このURLの子階層になります。

GET http://example.com/articles/2

記事IDが2の記事に新しいコメントを作成する場合、POSTを使用し以下のように指定します。新しいコメントのIDはサーバー側で決定されます。

POST http://example.com/articles/2/comments

この記事をGETで参照する際のURLは、このURLの子階層になります。

GET http://example.com/articles/2/comments/1

PUT/PATCH

基本的なルール

PUT/PATCHは、サーバーにあるデータを変更するときに使います。PUTはべき等なので「保存ボタン」を連打しても大丈夫です。一方PATCHはデータを部分的に更新するときに使われ、べき等でないと定義されています。Rails4.0から、データの変更処理にPUTではなくPATCHが使われるように仕様が変更されました。主な理由は、「Railsの変更処理はべき等でないから」だそうです。Railsでは変更処理のたびにデータの変更日時が更新されるので、同じ内容で変更しても1回目と2回目では変更日時の更新内容が異なるということみたいですね。これには賛成もあれば、ちょっと厳密すぎじゃないか? という意見もあるようです。GETで記事を見にいったのに、アクセスカウントのデータが更新されてしまうのは、べき等でないのか? など、気になる方はGoogle先生に聞いてみましょう。

RESTのルール

RESTで定義しているURLの使い方です。PUTやPATCHでは、URLに該当するデータを更新します。更新内容はURLには含まず、POSTと同じように見えないパラメータ(リクエストヘッダの中)で送ります。そのため、GETのときとURLが同じです。

GET http://example.com/articles/1 (更新前のデータが見られる)
PATCH http://example.com/articles/1
PATCHパラメータ title=hello&body=This%20is%20a%20test.
GET http://example.com/articles/1 (更新後のデータが見られる)

DELETE

サーバー上のデータを削除する際に使います。DELETEも、何度実行しても結果が変わらないべき等な処理です。

GET http://example.com/articles/1 (削除前のデータが見られる)
DELETE http://example.com/articles/1 (URLに該当するデータを削除)
GET http://example.com/articles/1 (このURLはリンク切れになる)
DELETE http://example.com/articles/1 (URLに該当するデータはないが、再度実行)

2回目のDELTEが実行されても、このURLはリンク切れのままです。代わりに他のデータが削除されることもありません。HTTPメソッドは他にもありますが、Railsでメインに使用するのは、GET、POST、PUT/PATCH、DELETEの5種類です。

最後に

いかがでしたか?開発環境を整えるのは骨を折ったかもしれませんが、Rails自体はとても簡単に使い始められたのではないでしょうか。これから勉強を進めるのが楽しみになってきました。それではまた!

1983年生まれ。大学卒業後、ソフトウェア開発の営業を経て、ソフトウェア開発業務に転向。現在は自社パッケージのフロントエンド開発のほか、PHPでの受託開発案件、日→英のローカライズ案件などを担当。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています