WebサービスとWebアプリケーションを区別する意義

先に結論を書いておくメソッド

書き上げてみたら、やたら長くて読みにくいので(^^;、先に結論だけ書いておきます。

  • "Webサービス"=とことんRESTfulにリソースを提供する層
  • "Webアプリケーション"=RESTfulではない部分を受け持つ層
  • WebアプリケーションはWebサービスを利用する側として、Webサービスのひとつ上の層になる

では、本文へどうぞ…。

この記事はツッコミに対する言い訳用ですよと…

前回書いた記事id:yoheiさんから、「Web アプリと Web サービスは区別しないで欲しいなあ…」という、はてブコメントを頂きまして、改めて自分の記事を読み返してみたんですが、ちょっと言いたかった事が伝わりにくかったかな…という気もするので、"WebサービスとWebアプリケーションの区別"というところに関して補足しておこうと思います。

で、id:yoheiさんのツッコミを正しく理解する為に、ちょうど"WebサービスとWebアプリを区別しないとうまくいく"というタイトルが付いている、WEB+DB PRESSのREST鼎談#5を改めて見てみました。

鼎談の中でid:yoheiさんが、はてなブックマーク件数を画像で取得するAPIの事を例に挙げて説明されていますが、ここで仰っているのは、「リソースを提供する時に、"機械からのアクセス"とか、"人間からのアクセス"とか区別しないで、どちらにも優しい(易しい)ものを提供するべきだよ」という事だと理解しました。

なので、「Webサービス(機械からのアクセス)とWebアプリケーション(人間からのアクセス)は区別しないで欲しい」と言われたのだと思いますが、前の記事で自分が区別したかったのはそこでは無いという事を少し補足させてもらおうかと思います。

結局、何を区別したかったのか?

リソースを提供するのに、"機械から"とか"人間から"とか区別する必要はないというのは全くその通りだと思っています。

ただ、はてなブックマーク件数のAPIみたいに、単純にGETするだけのものなら、機械からでも人間からでもアクセスできるリソースなので良いんですが、PUTやDELETEが絡んでくると、例えば「リソースを更新する前に確認画面は欲しいよね」とか「今のブラウザってそもそも、PUTもDELETEもできないよね」とか、およそRESTとは関係無さそうな要素がありますよね?

そういう問題は本来リソースを提供したい側は考える必要の無い事で、単純にリソースに対するCRUDだけを提供して、「PUTする前に確認画面出すとか、使う側で勝手にやってよ」って言うのが本音だと思うんですよね。

実際、Ajaxだったりデスクトップアプリケーションだったりは、確認画面が必要であれば、リソースとして提供するんではなくて、リソースを使う側が実装するものだと思います。じゃあ、ブラウザがRESTfulなリソースにアクセスする時に、いきなりアクセスできるかと言うと、やっぱり確認画面だったりPUT/DELETEだったりの問題を引き受ける"何か"が必要になりますよね。

そういった、"RESTfulではない層"というのを、"RESTfulな層"のひとつ上に置いて、それらをきちんと区別するべきじゃないかな、というのが前回の記事で言いたかった事になります。

なので、"区別する"と言っても、同じサービスを提供するのに、「対機械用にWebサービスを、対人間用にWebアプリケーションを」という話ではなくて、Webサービスは飽くまで徹底してRESTfulにして、それを使う上でどうしてもRESTfulにできない部分を切り出して、対ヒューマノイドインターフェイスとしてWebアプリケーションを作れば、それぞれの責務も分かりやすくなるし、いいんではないかなと。

前回の記事では、"Webサービス=RESTfulな層"、"Webアプリケーション=RESTfulではない層"で、なおかつ"WebアプリケーションはWebサービスを利用するモノ"というつもりで書いていたんですが、そんな捉え方をする事自体、無理があるんでしょうかね…?(^^; 自分的には、こういう区切りで考えるのが、今となっては一番自然になってしまってたりします。

色々書いてはみるんだけど…

という訳で、RESTに関する想いを色々綴ってはみる訳ですが、書けば書くほど、「それ、鼎談で言ってるよ」というところを、なかなか越えられないという罠…。(^^;

でも、少なからず、自分の実感としてあの鼎談で話されている事を書けるようにはなってきた訳で、もう既にどこかで話されている内容であったとしても、もう少し、自分の言葉として思っている事を書くのは続けてみようかなと思います。