クールなURIは変わらない
クールなURI(Cool URI)
- 良いURI
- きれいなURI
- 1998年 Tim Beners-Lee著 の「Cool URIs don't change」
https://www.w3.org/Provider/Style/URI
頻繁に変わるURIの時代
Webの根幹を揺るがすURI変更の問題
- Webはそれぞれのリソースへのリンクが埋め込まれたハイパーメディアシステム
- リンクが切れるとハイパーメディアシステムが機能しない
URIを変わりにくくする
プログラミング言語に依存した拡張子、パスを含めない
- CGIへの依存
- 例)http://example.jp/cgi-bin/login.pl
- CGIの難点
- システム方式が変更になった際にURIが変更される
拡張子への依存
- 例)http://example.jp/cgi-bin/login.pl
- 拡張子「.pl」はPerl言語の仕様
- 「.pl」でRubyを動作させることは可能
- メンテナンス性、可読性が低下
- 実装言語が変更になった際にURIが変更される
言語特性への依存
- 特定のサーブレットコンテナを示す
- 例)http://example.jp/servlet/LoginServlet
- Javaなどが使用するサーブレットシステムに依存
- PHPなどに変更した際にURIが変更される
- 言語文化による命名規則
- 例)http://example.jp/servlet/LoginServlet
- キャメル型のJava
- 小文字のPerl、Ruby
- 実装言語が変更になった際にURIが変更される
メソッド名、セッションIDを含めない
- フレームワークへの依存
- 例)http://example.jp/Login.do?action=showpage
- WebフレームワークのStruts特有の拡張子
- フレームワークを変更してシステム再構築時にURIが変更される
- メソッド名の依存
- 例)http://example.jp/Login.do?action=showpage
- 「showpage」というメソッドが呼び出されるURI
- リファクタリングでメソッド名が変更になった際にURIが変更される
- セッションIDの依存
- 例)http://example.jp/home.jsp?jssessionid=12345678
- JavaでCookieを使用せずにセッションIDを埋め込むとURIに含まれる
- システムにログインしなおすと変更になる
URIはリソースを表現する名詞にする
URIに動詞は含めない
- 例)http://example.jp/sample/people/show/123
- ID123である人物のリソースURI
- sampleアプリケーションのPeopleコントローラーのshowメソッドを利用
リソースをどうするかはURIでは指定せず、HTTPメソッドで決定
- URIとHTTPメソッドの関係
- URI:名詞
- HTTPメソッド:動詞
- クールなURIの例)
http://example.jp/sample/people/123をHTTPでGETメソッドで呼び出す
URIの設計指針
- URIにプログラミング言語依存の拡張子を利用しない(.pl、.rb、.do、.jspなど)
- URIに実装依存のパス名を利用しない(cgi-bin、servletなど)
- URIにプログラミング言語のメソッド名を利用しない
- URIにセッションIDを含めない
- URIはそのリソースを表現する名詞とする
URIのユーザビリティ
シンプルなURIによるユーザビリティの向上
- 文字数が少ない
- 広告などで様々なメディアにも利用できる
- 覚えやすい
- 一般時にもなじみやすい
- 「servlet」は一般人にはなじみにくい
- 「server」と勘違いしやすい
URIを変更したい場合
リダイレクトで転送する
リダイレクトの例
リダイレクトの実現
- HTTPサーバーで用意
- Apacheの場合、mod_rewriteなどのモジュールで実現可能
URI設計のテクニック
拡張子で表現を指定
コンテントネゴシエーション
- クライアントの言語設定によって自動的に適した表現を返す
- 1つのリソースが複数の表現を持つ
- プレスリリースを日本語版、英語版それぞれをOSの言語設定によって変更できる
- GET /2010/05/01/press HTTP/1.1 Host:example.jp Accept-Language:ja,en_us;q=0.7,en;q=0.3
言語を拡張子で指定
- OSの言語設定と異なる言語のリソース表現を取得したい場合に有効
- 日本語版 http://example.jp/2010/05/01/press.ja
- 英語版 http://example.jp/2010/05/01/press.en
フォーマットを拡張子で指定
- 1つのリソースを複数のフォーマットで表現したい場合に有効
- HTML版 http://example.jp/2010/05/01/press.html
- JSON版 http://example.jp/2010/05/01/press.json
マトリクスURI
階層構造ではなく、複数のパラメータの組み合わせで表現
- 地図の場合
- 緯度(lat)、経度(lng)を定義
- あらかじめ順番を定義して起き、省略も可能
「/」(スラッシュ)を使用して階層を表現が一般的なURI
URIの不透明性
- URIはクライアントにとって不透明であるべき
- サーバーとクライアントが密結合になるため、URIを変更した際に動作しなくなる
- クライアント側で内部構造を推測してURIを組み立ててはいけない
- クライアントはサーバーが提供するURIをリンクをたどる
- 例外)スクレイピングなどのハックして情報を勝手に取り出す場合など
URIへの強い意識
【WEBを支える技術】URI設計編~良いURI設計とは~ - WEB道楽
【WEBを支える技術】HTTP基礎編~シンプルさが標準化~ - WEB道楽