(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

RESTとは?

自分の理解も曖昧だったので改めてRESTとはなんなのか整理する。

まぁきっかけは@が半分と最近WebアプリケーションのURIやそれに紐付く諸々で悩むことがあったので、どうせなので調べてまとめようって思った。
あと、"なうでヤングなモテWebアプリケーション"を作る上で、しっかり押さえてないとまずいと思ったっていうのもある。JAX-RSの本もRESTfulできゃっきゃうふふする系ぽいし(適当)、ここで一度ちゃんと抑えておくのも悪くないはず。というか、比較的webに近い立ち位置にいるのにちゃんと理解していないのはまずい。まずい。

RESTとは

Representational state transferの略っていうのはどこにでも書いてあるのでまぁ良いとして、Wikipedeiaさんあたりに書いてある幾つかの制約をセットにしたものをRESTと読んでいるみたい。

  • Client-server(クライアント/サーバ)

通称(?)クラサバ。Webが採用しているアーキテクチャスタイル。
クライアントとサーバがHTTPっていうプロトコルで通信して、クライアントはサーバにリクエストを送り、サーバはそれに対してレスポンスを返してあげるのです。
利点はひとつのコンピュータ上ですべてを処理するんじゃなくて、クライアントとサーバに分離して処理できること。これのおかげでwebへスマホやケータイゲーム機などからもアクセスできますよね。

  • Stateless(ステートレス)

ステートレスサーバって書いたほうがよいかな?
クライアントの「状態」をサーバが管理しないという意味です。利点はサーバ側の実装を簡略化できること。それから状態を管理しないことによって、レスポンスを返したしまえばその分、計算機のリソースを開放できるというわけです。現実的にはCookieを使ったフォーム認証があったりするし、それをやめるわけにもいかないので必要最低限使いましょうってのが妥協点?

  • Cacheable(キャッシュ)。

一度取得したリソースをクライアント側で使いまわす方式。
利点はサーバとクライアントの通信を減らすことができるので、ネットワークの帯域の利用と処理時間を縮小できること。ただ、情報の鮮度が落ちるので当然ながら信頼性が下がる可能性もある。

  • Layered system(階層化システム)

クライアントが直接サーバに接続されている必要がなくて、間に仲介役のサーバを挟んだり、ロードバランサーなどを設置して負荷分散を行うことができるようなシステムを階層化システムと呼ぶってことかな。

  • Code on demand(コードオンデマンド)

プログラムをサーバからダウンロードして、クライアントで実行するアーキテクチャスタイル。
今だとJavaScriptかFlashってとこですかね。これの利点はサーバ側の実装をいじらなくても、あとからクライアントの方を拡張できるということ。ちなみにこれはRESTの中ではオプションとして考えられているのだけど、最近だと使わない方が珍しいし重要性があがっていますよね。僕はJavaScript苦手なんですけどね。

  • Uniform Interface(統一インターフェース)

URIで示したリソースに対する操作を統一したインターフェースで行うアーキテクチャスタイルのこと。
これによってリソースの識別ができたり、自己記述的メッセージを送ることが可能になる、、、のかな?ちょっとこのへんよくわかってない感じある。

そういうわけで上の制約を満たすようなのを特にRESTfulっていうそうです。RESTそのものの利点とかはこれの集合だと思ってもらえれば良いのではーとか。

で?

ここまで書いて飽きた(マテ
えっと個人的に最近、URI設計*1というのを気にしていて、例えば"http://example.com/users/8"みたいな感じのURIがあったとしたら、「8があるんだから9もあるよね」って簡単に推測できてしまう。Twitterなんかだとユーザー名でURIを作っているので予測というのはしづらく、これによってURIの不透明度があがっているように思う。あと、設定画面なんかも個別にURI(リソース)を用意するのではなく、単一の画面を認証情報によって表示するものを変えている。
「このリソースは誰に見えてよくて、他の人にも見せていいの?」とかそういうのって、Webアプリケーションを実装するときだけじゃなくて、URIを考えるのでも大事なんだなーって思っているのが最近。ギョームアプリばっかり触っていると「アドレスバーは見えなくするし、適当にやっていいよ。HTTPのメソッドはGETとPOSTだけで十分だよ」みたいな感じになりがちというか、僕は不幸にもそうやって育てられたのであまり気にしたことなかったんですが、最近Webアプリケーションを作っていてこういうの大事なんだなーって思ったり。

というわけで

昔買った、「Webを支える技術」という本を読み直しています。昔に比べるとちゃんと理解度があがっていて良い。
あと「RESTful Webサービス」もそのうち買って読もうっと。

*1:と呼べるような大袈裟なものじゃないけど