Drafts

@cm3 の草稿置場 / 少々Wikiっぽく使っているので中身は適宜追記修正されます。

あるURIが対応しているmimetypeを発信する/知る方法

Content negotiation の前に

content negotiation で Accept ヘッダーに複数の mimetype を優先順位つけて書くこととかはできるけれど、そもそもあるURIにアクセスするようなプログラムを組むときに、そんなあやふやなことはしない。jsonで欲しいとか決め打つだろう。じゃあ、あるURIが対応しているmimetypeを発信する/知るにはどうしたらいいか。

1. 300 Multiple Choices をちゃんと使う

これは今すぐあなたが取れる解決策ではない。長い時間をかけて、みんなが合意していけるかもしれないという話だ。300はHTTP/1.1では既に規定されていたが、詳細はいろいろ定まらないままであまり使われていない。それは今でも同じだ。しかし、今現在rfcも策定中のHTTP/2では、300に関してメモが付けられていて、Linkヘッダーの使用が示唆され、RFC 5988へのリンクが張られている。例は以下のとおりで、この rel に alternate を用いて、またmimetypeも付記してコミュニケーションすればよいという方法だ。

   Link: <http://example.com/TheBook/chapter2>; rel="previous";
         title="previous chapter"

2. とりあえずhtmlを返して、そのヘッダーにlinkをちゃんと書く

RFC 5988で rel の統制語彙である alternate については html4 の文書を参照するように書かれている。基本的に link ヘッダーについては htmlの仕様側が先行していて、代替フォーマットを記述する方法は既に決まっているし、実践も進んでいて、Linked Data: Webをグローバルなデータ空間にする仕組みの5.1.2.3節にも

<link rel="alternate" type="application/rdf+xml" href="company.rdf">

をHTMLヘッダに書く例が示されている。

3. データセット全体についての情報を提供する

LODならデータセットにvoidがついていることがあって、そこに void:feature で RDF のシリアライゼーションの候補とか書かれているかもしれない。

ja.dbpedia.org/void.ttlを例にとると、

  void:feature
    <http://www.w3.org/ns/formats/RDF_XML>,
    <http://www.w3.org/ns/formats/N3>,
    <http://www.w3.org/ns/formats/RDFa> .

と書かれている。ちなみに、http://www.w3.org/ns/formats/という名前空間は mimetype よりももっと詳細化したフォーマットを書こうとしているようだ。mimetypeについてのURIMedia Typesに書かれているのを使うのがいい気がするが、用例は知らないので要調査。

Content negotiation の必要性

なんで Content negotiation が使われているかは Linked Data: Webをグローバルなデータ空間にする仕組み の"2.3.3 ハッシュ vs. 303"にアクセスの回数と、一回のアクセスあたりの通信量のトレードオフが書かれていることからも無駄に通信しないためなのかなと思う。

その他参考資料:


2015/2/28追記

Linked Data Platform 1.0見てると、HTTPヘッダー使うのはRESTful思想が混じってるよなーと思う気もする。要調査