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についてのURIはMedia Typesに書かれているのを使うのがいい気がするが、用例は知らないので要調査。
Content negotiation の必要性
なんで Content negotiation が使われているかは Linked Data: Webをグローバルなデータ空間にする仕組み の"2.3.3 ハッシュ vs. 303"にアクセスの回数と、一回のアクセスあたりの通信量のトレードオフが書かれていることからも無駄に通信しないためなのかなと思う。
その他参考資料:
- MIME - Wikipedia, the free encyclopedia
- 4.8 Links — HTML5 HTML5にももちろんlinkタグの規定はある
- Media Types以外にファイルフォーマット全部についての情報を探してたら、List of filename extensions (alphabetical) - Wikipedia, the free encyclopedia)とかList of file formats - Wikipedia, the free encyclopediaがみつかった。でも、基本的にブラウザが解釈しないんだったら、バイナリは application/octet-stream とかにしておけば良いのかな。
2015/2/28追記
Linked Data Platform 1.0見てると、HTTPヘッダー使うのはRESTful思想が混じってるよなーと思う気もする。要調査