Aaron SlomanとHaider Sabriは、MIX08(サイト・英語)で「WCFでのRESTfulなAPI作成」(source)と題して、RESTChess(サイト・英語)というRESTのサンプルアプリケーションを紹介した。
講演は、Aaron SlomanのWCFでのRESTサポートに関する背景説明から始まった。その後、Haider Sabriが、RESTとその主要な機能について簡単な紹介を行った。Haiderによると、RESTの重要な利点は、以下の通りである。
- 参入障壁の低さ
- ROAは、Web Semanticsを引き継ぐもので、ウェブサービス用APIには手頃
- レスポンス・フォーマットが柔軟
Haiderは、未知のクライアント用に汎用的なAPIを作成するには、RESTが最適と考えているようだ。
WCFはWebプログラミングモデル(source)を通してRESTをサポートする。サポートは、.NETフレームワーク3.5で追加されたが、以下の概念から成っている。
- URIテンプレートと WebGet/WebInvoke
- HTTPリクエストをクラス内のメソッドにマップするattribute。
- WebHttpBinding
- WebHttpBindingは、上記に基づいて、ディスパッチを可能にするWCFバインディングである。
- 開発者は、RESTとSOAP APIを簡単に切り替えることができる。
- WebOperationContext
- WebOperationContextを使うと、RESTfulなやりかたでリクエストとレスポンスを操作することができる。
RESTChess(zip)は、Haider Sabriによって紹介されたチェス・ゲームのためのRESTfulなAPIである。RESTChessは、WCFのWebプログラミングモデルに従って実装されたRESTfulなAPIの素晴らしいサンプルであるとともに、WCFウェブ・プログラミングモデルの欠点を補う一揃いの拡張(カスタムメイドのWCFバインディングとビヘイビア)である。
- 柔軟なURI
- IISでサービスをホスティングする際には、.svc拡張子をもったサービスが必要である。
- RESTChessは、IIS 7内のHTTPモジュールとして実装されているURL書き換え機能を提供する。
- GETとPOSTしかサポートしない低機能RESTクライアントにブリッジする。
- この問題を解決するためには、2つの一般的なアプローチがある。
- カスタムメイドのHTTPヘッダ
- _methodのクエリパラメータ
- RESTChessは、低機能もしくは高機能のRESTクライアントを区別し、メッセージを変更する、カスタムメイドのWCFチャンネルを実装する。メッセージの変更には、適当なHTTPメソッドにPOSTリクエストを使ってDELETEまたはPUTメソッドをトンネリングする。
- この問題を解決するためには、2つの一般的なアプローチがある。
- デジタル署名を使ったリクエスト認証
- RESTChessはOAuth(サイト・英語)を利用します。OAuthはデジタル署名を包含し、安全なAPI認証を可能とするオープンなプロトコルである。
- 署名は、クエリ・パラメーターとしてOAuth 消費者キー(consumer key)を通して渡される。
- カスタムメイドのWCFチャンネルはOAuthキー要求をチェックし、消費者が認証されない(キーは存在しないもしくは、未知)場合には、要求がサービス・モデルに送られる前に、例外を起こす。
- Formats 複数の表現フォーマット
- WCFは、XMLとJSON以外はサポートしない。
- RESTfulな例外処理
- RESTChessチームは、例外を適当なHTTPエラー・コードにマップするためのエンジンを構築した。
RESTChessチームは、欠けている部分をいろいろとWCFウェブ・プログラミングモデルに追加しなければならなかったが、Haiderによれば、高いレベルでWCFの機能を拡張したり追加をしたり、さらにそのスタックの上に構築できることこそWCFの素晴らしいところだとのことである。