REST と RESTful と RESTish について


はじめに

REST と RESTful 、さらに最近では RESTish という用語についてのまとめです*1


REST とは

REST(REpresentational State Transfer)という言葉が何を指すかは、かなり発散する話題です。

元となるのは Roy Fielding により示されたアーキテクチャスタイルで、アーキテクチャによる制約により以下のように導出されました。

f:id:Naotsugu:20191026000330p:plain


このようなアーキテクチャの制約により導出された REST は、以下のスタイル(制約)を持つものとされています。

  • Client-Server
  • Stateless
  • Cache
  • Uniform Interface
  • Layered System
  • Code-On-Demand

ほとんどは読んだままですが、Code-On-Demand は分かりにくいので少し説明しておくと、プログラムをオンデマンド形式で実行できるようにすることで、変更(拡張)を容易にするというスタイルです。サーバから配布されたプログラムをクライアントで実行する Web システムの(Javascriptなど現在の)一般的な形です。

Webネイティブで成功するためのアーキテクチャの様式として REST が導出されたのです。 現状のWebを利用したシステム構造と比しても馴染み深いものばかりですが、その中で注目すべきは Uniform Interface (統一インターフェース) です。

URL でリソースを表現し、HTTP メソッドでリソースを扱うという統一されたインターフェースが必要であるというものです。


その後「Rest in Practice」などで REST というアーキテクチャスタイルの成熟度が示されました。

REST in Practice: Hypermedia and Systems Architecture

REST in Practice: Hypermedia and Systems Architecture


  • Level 0 - The Swamp of POX (Plain Old XML として昔ながらのXMLを返すやり方)
  • Level 1 - Resources (リソースを動詞でなく名詞で表す)
  • Level 2 - HTTP Verbs (HTTPメソッドを正しく使い分ける)
  • Level 3 - Hypermedia Controls (レスポンスの中に関連するハイパーリンクを含める)

Level3までの達成が REST には必要であるとされています。


Webネイティブでスケールしやすいアーキテクチャスタイルとして示された REST ですが、抽象的な概念として示され、その後至るところで独自の定義が付与されて広まっていいきました。

あなたの API は REST なのか、そうではないのか、を区別するために RESTful という言葉が出てきます。


RESTful とは

O'Reilly 「RESTful Webサービス」では、Roy Fielding の論文で示された条件から判断して高いスコアを獲得するものだとされています。

RESTful Webサービス

RESTful Webサービス


  • 完全にREST原則に従うもは REST API と呼び、そうではない場合は RESTful API と呼ぶ
  • REST原則に従わないのであれば REST という言葉は使わす、HTTP API などと呼ぶべきだ
  • RESTful の -ful は満たすということなので、RESTful API は完全にREST原則を満たすものだ


RESTish とは

RESTful の対として RESTish という言葉が一般的に使われるようになりました(?)。

-ish は 「…のような」とか「…じみた」といった感じなので、なんとなく言いたいことは分かる。

元になったのが、monogamish という言葉から -ish を拝借したという話しがあります。 monogamish という言葉は Dan Savage という作家がコラムの中で使った造語で、以下のように説明される。

In a July 20, 2011 column, Savage coined the term "monogamish". The term describes couples who are perceived to be monogamous, who are "mostly" monogamous, but who are not 100% monogamous. Such couples have an understanding that allows for some amount of sexual contact outside the relationship.

つまり一夫一婦主義(monogamy)ではあるが、有る程度の浮気に対しては理解を示すような、 100% monogamy ではない関係を monogamish という造語で表現したということです。


実際問題として、完全にRESTの原則に従うことは難しく、RESTful と言われるものの99%は、REST純粋主義者の言う RESTful とは隔たりがあることが現実です。

そこで、REST 原則に従うのは結構大変だし、そもそもREST完全準拠なんて目指していないものが増えてきて、 これを区別して呼びたいというのが RESTish が出てきた背景になります。


まとめ

  • RESTful
    • REST原則を完全に満たすことを尊重するし、実際の話ほぼ準拠しているよ
  • RESTish
    • RESTは尊重するけど、厳密に従う必要性も感じないし、実際それで上手くいけばいいんだよ

純粋主義的な考えは置いておいたとして、REST 原則に概ね準拠、またはそれを目指すけど、完全に準拠しなくとも実際のところ十分です、RESTish で。


REST とか RESTful といった言葉を安易につかうと REST純粋主義者と要らぬ議論になるので、RESTish と言っておくのが良いかと思います。


ところで、マイクロサービスなどがもてはやされる中、システム内部のサービス間の連携を REST(RESTish) で賄おうとするのは、ちょっと違うかなぁと思う今日このごろです。



*1:今さらこんな記事を POST しているのは、昔書いたテキストを見つけたからです