2010年02月のブログ記事

RESTとURL設計の重要さを理解して「キレイなエンジニア」を目指す!

こんにちは、@kukoです。
今日は私の苦手なRESTの話をしますね。

はじめに

Rails1系から2系に上がった時に、頭を悩ませたのがRESTでした。

宗教じみてるし、なんか設定も複雑でやることが増えたような気がして、なかなかお友達になれない。

しかし、RoRのアプリを作っていくにあたって、どうしてもさけては通れない道でした。

私と同じように悩める方がいたらぜひ参考にして欲しくて、

RESTとは何か。
URLはどうあるべきか。

の、とっかかりとなる話をしたいと思います。

RESTとは

「RESTとは、ウェブのような分散ハイパーメディアシステムのためのソフトウェアアーキテクチャのスタイルのひとつである」

そんなこと言われても困ってしまいますよね。。

RESTは「リソース」を扱うための考え方であり、 URLというのは特定のリソースを指し示しているのです。

リソースとリソースの操作

RESTを考えるときによく出てくるのが「リソース」という単語です。

「リソース」とは、例えば掲示板があったとしたら、
掲示板の大元の書き込みであったり、
掲示板につけられたコメントのことであったり、
もしくは添付されたファイルや画像であったり、
そんなひとつの「情報」として扱えるものを指しています。

RESTの考え方では、リソースはそれぞれ固有のURLを持っています。

/bbs/3/comments/7

例えば、これは、id3の掲示板につけられたコメントの1つを指し示すURLです。

そしてそのURLに対して、「何をするのか」、それを「GET」「POST」「PUT」「DELETE」という4種類のHTTPのメソッドで操作をするのです。

URLはメソッド(動作)をあらわさず、メソッドはHTTPメソッドが対応します。
これがRESTの原則です。

古いRailsではactionがURLに入っていましたが、これは先ほど説明した「URLはリソースを指し示す名詞であるべき」という原則とは違いますね。

きちんとしたRESTでは、アクション名はURLに出るべきではないのです。 なぜなら、アクション名は動詞であり、URLはリソースを表すため、名詞であるべきだからです。

URLとメソッド名のギャップ

少し実装の話に踏み込みますと、設計はURL設計から始めると良いです。 キレイなURLが作れれば、コントローラーの実装で悩むことも少なくなるでしょう。

気をつけたいのはI/Fのレイヤーと実装のレイヤーでギャップがある場合です。

I/Fのレイヤーでは

「何を」= URL = リソース
「どうする」=HTTPメソッド

であらわします。
たとえば、先ほどの掲示板bbs/3にお気に入りの星をつけたい場合、RESTfullに書くなら

bbs/3/stars

というURLにPOSTリクエストを送ります。ここで、bbs/3/stars/addや、bbs/3/add_starにしないのは、 URLは名詞であるという前提からです。
考え方としては「starをcreateする」と考えてください。

これに対して、実装のレイヤーでは

「何を」=主としてコントローラ名、補助的にアクション名
「どうする」=アクション名

となるので
BbsControllerのadd_starがアクション呼ばれるようにするかもしれません。
(もし複雑だったらBbsStarsControllerのaddメソッドにするかもしれませんが)

どうでしょうか。このとおり、この2つのレイヤーの間には少しギャップがありますが、この2つのレイヤーの構造を意識して、 RESTっぽいURL設計はどうあるべきかを考えて設計すると良いでしょう。


少しはRESTとお友達になれそうですか?^^