Webを支える技術:URI設計のポイント

URIを変わりにくくする

Webはハイバーメディアシステム(ハイパーメディア:グラフィックス、音声、動画、テキスト、ハイパーリンクなどを絡み合わせた情報媒体)であり、リンク切れを起こすと、システムとして機能できなくなる。よって、『URIは変わらないべきである。変わらないURIこそが最上のURI』という主張がある。

じゃあ、『どういう観点が大事か🤔』となるので、その辺をまとめる。

プログラミング言語に依存した拡張子やパスを含めない

具体的には次のようなURIにしない。

http://example.jp/cgi-bin/login.pl
http://example.jp/servlet/LoginServelt

良くない点と理由をまとめる。

良くない点 理由
cgi-bin CGIはWebサーバ上でプログラムを動かすための仕組みだが、時代の流れで使われることが少なくなると、名前修正が必要になる
.pl Webサービスの言語は多々あり、メンテナンス性及び可読性を考えると、無い方が効率が良い
servlet システムをサーブレットからPHPに変えるとURIも変更になってしまう
LoginServlet 大文字小文字文化は実装言語によって異なり、誤解を与えてしまう

メソッド名やセッションIDを含めない

具体的には次のようなURIにしない。

http://example.jp/Login.do?action=showPage
http://example.jp/home.jsp?jsessionid=12345

良くない点と理由をまとめる。

良くない点 理由
showPage メソッド名がURIに含まれると、リファクタリング時にメソッド名が変更されると、URIが変わる
jsessionid=~ CookieではなくセッションIDをURIに埋め込んでしまうと、ログインの度にURIが変わる

URIリソースは表現を名詞にする

具体的には次のようなURIにしない。

http://example.jp/sample/people/123

理由は、あるリソースを取得するか更新するかは、URIで指定するのではなく、『URIに適応するHTTPメソッド』で決定する。つまり、URIとHTTPメソッドの関係は『名詞(URI)と動詞(HTTP)』となる。もう少し補足すると、URIは『何を』意味し、HTTPは『どうする(GETorPOST...)』みたいなイメージ。

リダイレクトとは

URIに変更したい時にどうするか』という問いに対しては、できるだけ『リダイレクト』を使うようにする。リダイレクトは、古いURIに転送するためのHTTPの仕組みのこと。ページを移動もしくはリネームするような時にとても大事。

URI設計のテクニック

拡張子で表現を指定する

URI設計において拡張子は良くないと上の例にもあるが、それは実装に依存するような場合で、次のようなパターンの時には良いとのこと。

項目名 説明
コンテントネゴシエーション クライアントがAcccept-Languageヘッダでリクエストする言語設定を指定し、サーバからリクエストした表現を返してもらう。
言語を指定する拡張子 http://**/hoge.jahttp://**/hoge.enといった形でリソースの言語を明示的に指定する。コンテントネゴシエーションはブラウザ設定を変更する必要があるがこっちはない。

マトリクスURI

階層構造で表現しにくいURIを表現する際に用いる。例えば地図サービスの緯度(lat)、経度(lng)を指定するようなURIは次のようになる。

http://example.jp/map/lat=35.705471;lag=139.751898

一般的に、マトリクスURIを表現する際には、パラメータの順序が意味を持たない場合セミコロン、意味を持つ場合カンマを用いる。よって、上のURIを順序で示す場合には下のようなURIになる。

http://example.jp/map/35.705471,139.751898

参考