devdevdevReports

dev系開発開発者の開発日記

【WEBを支える技術】URI設計編~良いURI設計とは~

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

  • 作者:山本 陽平
  • 発売日: 2010/04/08
  • メディア: 単行本(ソフトカバー)

クールなURIは変わらない

クールなURI(Cool URI

頻繁に変わるURIの時代

  • 1998年当時 URIが変更になるのは日常茶飯事
  • ブックマークしたWebサイトが突然見えなくなる
  • 検索エンジンの検索結果に出てくるWebサイトが見つからない

Webの根幹を揺るがすURI変更の問題

  • Webはそれぞれのリソースへのリンクが埋め込まれたハイパーメディアシステム
  • リンクが切れるとハイパーメディアシステムが機能しない

URIを変わりにくくする

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

  • CGIへの依存
  • 例)http://example.jp/cgi-bin/login.pl
  • CGIの難点
    • リクエストのたびに起動するCGI方式では性能面で難点
    • CGIではPerl言語が主流だが、実装言語の選択肢が増加
  • システム方式が変更になった際にURIが変更される

拡張子への依存

  • 例)http://example.jp/cgi-bin/login.pl
  • 拡張子「.pl」はPerl言語の仕様
  • 「.pl」でRubyを動作させることは可能
  • メンテナンス性、可読性が低下
  • 実装言語が変更になった際にURIが変更される

言語特性への依存

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

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

URIの設計指針

URIユーザビリティ

シンプルなURIによるユーザビリティの向上

  • 文字数が少ない
    • 広告などで様々なメディアにも利用できる
    • 覚えやすい
  • 一般時にもなじみやすい
    • servlet」は一般人にはなじみにくい
    • 「server」と勘違いしやすい

URIを変更したい場合

リダイレクトで転送する

  • 古いURIから新しいURIに転送するHTTPの仕組み

リダイレクトの例

リダイレクトの実現

  • 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
    

言語を拡張子で指定

フォーマットを拡張子で指定

マトリクスURI

階層構造ではなく、複数のパラメータの組み合わせで表現

「/」(スラッシュ)を使用して階層を表現が一般的なURI

URIの不透明性

  • URIはクライアントにとって不透明であるべき
  • サーバーとクライアントが密結合になるため、URIを変更した際に動作しなくなる
  • クライアント側で内部構造を推測してURIを組み立ててはいけない
  • クライアントはサーバーが提供するURIをリンクをたどる
  • 例外)スクレイピングなどのハックして情報を勝手に取り出す場合など

URIへの強い意識

  • URIはリソースの名前である
  • URIは寿命が短い
  • URIはブラウザがアドレス欄に表示する

【WEBを支える技術】を読む理由 - devdevdevReports

【WEBを支える技術】REST編 - devdevdevReports

【WEBを支える技術】URI仕様編 - devdevdevReports

【WEBを支える技術】URI設計編~良いURI設計とは~ - devdevdevReports

【WEBを支える技術】HTTP基礎編~シンプルさが標準化~ - devdevdevReports

【WEBを支える技術】HTTPメソッド編~名は体を表す~ - devdevdevReports

【WEBを支える技術】HTTPステータス編~名は体を表す~ - devdevdevReports