naoyaのはてなダイアリー - MVCフレームワークにおける Web API 実装
Sledge における Web API (XML-RPC/AtomPP) のハンドリングについての言及がありました。これからの MVC フレームワークに求められる必要条件の一つとしてこの Web API を処理しやすいかどうかというのは重要な気がします。
MVC フレームワークと Web APIs (XML-RPC, REST, SOAP) な話。
Catalyst や Sledge なんかの XML-RPC 実装なんかもプラグインででてきていて、Sledge::Plugin::XMLRPC は CPAN から入手できるわけですが(グッジョブ!)、どうも利用者側の実装方法が若干スマートにならない気がしています。
というのは、
use Sledge::Plugin::XMLRPC; sub dispatch_xmlrpc { my $self = shift; $self->xmlrpc; } sub xmlrpc_echo { my $self = shift; return join " ", @_; }
という感じで、XML-RPC だけ処理する メソッドを作らないといけないんじゃないか? という部分ですね。これは Catalyst のプラグインも同じです。
まあ実装方法にもよるわけですが、やはり MVC や DRY を考えると、API の Transport レイヤーを気にせずドメインロジックを実装する というのが美しい姿なのかなぁと。たとえば Amazon Web Services が REST と SOAP で同一の API が利用可能なように。
どこかで理想的な作り方があったなぁと use Perl; を検索してみたら、So I've written Attribute::WebService. I'll stick it on CPAN this week, though it's pretty raw right now. という 2001 年に Matt Sergeant が書いた journal がひっかかってきたり。Transport レイヤーをうまく抽象化して再利用ができるようになるとステキですよね。
という風に見ると、API の Transport レイヤーは MVC の View なんじゃないかという風にも見えたり。blosxom という Blog ソフトで一番関心したのは URL とテンプレートの拡張子がマッピングしていて、index.html で XHTML, index.rss で RSS 2.0, index.atom で Atom フィードというように View をカンタンに切り替えられる点。多くの Blog ソフトが RSS/Atom フィードをテンプレートで出力することから考えても、データフィードや IO を View として分離するのがスマートだなぁと感じます。
で、Web API と MVC なんて話でいうと、
Model-View-Controller in Web 2.0
Think about it like Address Book - with a database backend (the model) and a web services API (the controller), the actual web site itself becomes just one of potentially many views on the data.
Web 2.0 のサービスアーキテクチャを MVC にたとえた記事も。これはすごくストレートに入ってきます。Web API を Controller として提供して、それを利用するサードパーティやデスクトップアプリが View となる。データ提供者は Model と Controller だけを実装して、それを remix / consume する側がさまざまな View を用意できるというアーキテクチャ。
naoya さんはこの記事に 「デスクトップアプリケーションが V で API が C という考え方。(API は C というか M だと思うけど。)」 とコメントしていて面白い。これは API を利用するサードパーティ から(しかもアーキテクチャではなく実装サイドから)見た意見なのだと思います。たとえば、amazlet の実装の中では Amazon Web Service は Model となる。
ただ、アーキテクチャという視点では、iTMS を例にとれば、iTMS のデータベースは Model, プロトコルが Controller で、iTunes の UI が View というのはしっくりきます。いろんな視点で各所に MVC 的な役割分担が見えてくるのも興味深い。
「Web 2.0 のサービスアーキテクチャを MVC にたとえた記事も。これはすごくストレートに入ってきます。・・・」
のところなのですが、ちょっと宣伝っぽくなりますが、私の会社で作っている Busium Formula という製品は、ウェブ・システムを MVC 分離パターンに合わせてデザインし直したような設計になっていて、Controller の部分を XML によって設定できるような形になっています。それでもって、これを今後、Model を外部のSOAPや公開されたWEB API に対して接続可能とし、View を統合するという形の発展を考えています。