ADO.NET Data Service:RESTfulな実装について3

こんにちは、こだかです。

今回は「1)RESTfulな実装」の中から、「戻りはAtomPub JSONフォーマット」の部分をご紹介します。

RESTfulな世界では「リソースが主体になる」と言うお話を以前書きましたが、このリソースとは設計者が考えたメタデータです。と言うか、カタカナで書くと私がよくわからないwので、誤解を覚悟で書くと、設計者が扱いたい対象そのものをリソースと呼ぶことにしましょう。
リソースを主体としたServiceを構築する場合、当然そのリソースは、最終的にServiceを利用するクライアントのPC上で扱われることになりますので、特定のフォーマットや言語で提供する必要があります。
例えば、XML、プレーンテキスト、CSV、Webページそのもの
など、様々な表現方法が考えられますよね。

では、Serviceが表現方法を複数提供できる場合、クライアントがどのように要求するべきか?を考えてみることにしましょう。

まず、表現ごとにアドレスを分ける方法が考えられます。
例えば、人集合の中の男性を表す場合、以下のように個別のURLを割り当てることで実装する方法です。
XMLで出力 https://www.hogehoge.com/person/male.xml
HTMLで出力 https://www.hogehoge.com/person/male.html

前回、「リソースは少なくとも一つのアドレスを持つ必要があります。」と書きましたが、これは複数のアドレスが同じリソースを指している例になります。
ただ問題は、アドレスが別れている為に、使用者が別のリソースと勘違いする可能性がある点ですね。(こういった観点からも、リソース主体の設計ではアドレスの付け方にセンスが要求されます。)
なお、この考え方で複数の表現方法に対して対応を行っているのが、Ruby on Rails のActiveResourceです。

もう一つの方法としては、HTTP content-type negotiationの使用が考えられます。これは、HTTPのリクエストヘッダーにフォーマットなどの指定を記述する方法です。
身近な例では、Webブラウザの言語を切り替えることによって、Webサイトの言語が変わる等は経験があるのではないでしょうか?
ちなみに、ADO.NET Data Serviceの対応はこちらになり、AtomPubとJSONをサポートしています。

上記の例であれば、URLはhttps://www.hogehoge.com/person/maleで共通ですが、HTTPのリクエストヘッダーにフォーマットを記述することで、表現の切り替えが可能だと言うことですね。

では、実行例をご覧頂きましょう。ADO.NET Data Serviceで作成したService https://localhost/test/jinji.svcに対してGET(https://localhost/test/jinji.svc/job(101))をリクエストしてみました。
HTTP content-type negotiationを指定したいので、Webブラウザではなく、Fiddlerと言うツールを使用しています。(画像はクリックすると拡大します)

AtomPub

Json

jsonの例の中でHTTPヘッダーに、「Accept: application/json」とありますが、これが指定部分です。(AtomPubは省略可能)

この考え方が進んで行けば、クライアントは人/プログラムを問わないと言う、Service実装も考えられるのですが、現状そこまで可能な例はあまりないと思います。
(ADO.NET Data Serviceで実装できているわけではありませんのでご注意を・・・)

こだかたろう