岩本隆史の日記帳(アーカイブ)

はてなダイアリーのサービス終了をうけて移行したものです。更新はしません。

続・多言語リソースのURIに関する覚書

昨日の日記の最後にこう書きました。

正規URIに対してリクエストがあった場合、サーバは英語とスペイン語、どちらでレスポンスを表現するか決めなければなりません。Accept-Language ヘッダを見てもよいのでしょうが、それだとコンテントネゴシエーション方式と紛らわしいので、デフォルト言語をあらかじめ決めておいてもよいのではないか、と個人的には考えています。

この段落を書きながら、実は「なんだかおかしいな」とも感じていました。今日、違和感の原因が分かりました。

違和感の原因その1:プラトニック形式のURIのみ提供?

RESTful Webサービス』の「4.6.1 表現の選択」にこうあります。

コンテンツネゴシエーションと呼ばれる方法もある。この場合は、プラトニック形式のURIhttp://www.example.com/releases/104)のみが提供される。このURIへのリクエストを送信する際、クライアントは受信したい表現の種類を知らせる特別なHTTPリクエストヘッダーを送信する。

しかし、「コンテントネゴシエーションではプラトニック形式のURIのみ提供される」というのは、著者独自のやり方ではないでしょうか

分かりやすいので「セマンティック Web のためのクールな URI」の例を引きます(一部修正しています)。

GET /people/alice HTTP/1.1
Host: www.example.com
Accept: text/html, application/xhtml+xml
Accept-Language: en, de

サーバーは次のように応答するでしょう。

HTTP/1.1 200 OK
Content-Type: text/html
Content-Language: en
Content-Location: http://www.example.com/people/alice.en.html

ご覧の通り、プラトニック形式と非プラトニック形式のURIを提供しながらコンテントネゴシエーションできるわけです。

「4.6.1 表現の選択」では、各言語にURIを割り当てる方式とコンテントネゴシエーション方式が別物として扱われていますが:

  1. 各言語にURIを割り当て、
  2. 希薄化を緩和するためにプラトニック形式のURIを提供し、
  3. かつコンテントネゴシエーションする

ことも可能ということです。

違和感の原因その2:デフォルト言語を決めるべきか?

冒頭に引用した段落に書いたとおり、プラトニック形式のURIがリクエストされた場合にどの言語で返すかを決めるには:

  • Accept-Languageヘッダを見る
  • あらかじめデフォルトの言語を決めておく

という方法があります。昨日の時点では、後者のほうが好ましいと考えていました。Accept-Languageヘッダを知らないユーザも多いだろうし、知っていても変えるのが面倒なこともあると思ったからです。

しかし、デフォルトの言語を勝手に決めてそのリソースを返すのも、必ずしもユーザにとっては嬉しくないのではないでしょうか。少なくとも私がユーザだったら、表現可能な言語一覧を見て自分で選びたくなるかもしれない。

などと考えながら同書の付録を見ていると、「B.4.1 300(Multiple Choices)」が目にとまりました。これで上記の要求を満たせるのではないか。

そこで、このステータスコードの簡潔な説明例を引いてみます(一部修正しています)。

300 Multiple Choices


要求されたURIは、2個以上のリソースを参照している。例えば、URIは複数言語に翻訳されているドキュメントを参照することができる。サーバによって戻されたボディ部には、正しいリソースを選択する方法に関してより詳しいデータのリストを入れることができる。

HTTPステータス・コード

確かに、私の要求は満たせそうです。

結論

というわけで、現状、多言語対応リソースについては下記のように実装しようと思っています。

プラトニック形式のURIに対してGETリクエストがあった場合
ステータスを「300 Multiple Choices」とし、各言語別のURI一覧を返す。
プラトニック形式のURIに対してGETリクエストがあった場合
ステータスを「200 OK」とし、指定言語でリソースを返す。また、Content-Locationヘッダでプラトニック形式のURIを返す。