URIの重要性
URIはUniform Resource Identiferの略で、直訳すると「統一リソース識別子」だ。
URIは、「リソースを統一的に識別するID」
URIを使うと、Web上にあるすべてのリソースに簡単にアクセスできる。
URIの構文
https://qiita.com/drafts/08a5fa533e72f83f6937/edit
このURIを構成するパーツは次のようになります。
- URIスキーム: https
- ホスト名: qiita.com
- パス: /drafts/08a5fa533e72f83f6937/edit
URIスキームはそのURIが利用するプロトコルを示すのが一般的。
URIスキームとその後ろに続く部分には「://」で区切られます。
ホスト名はDNSで名前が解決できるドメイン名か、IPアドレスで、インターネット上で必ず一意になります。
パスは、そのホストの中でリソースを階層的に示します。
このような仕組みであるリソースのURIが世界中の他のリソースのURIと絶対に重複しないようになっています。
複雑なURIの例
http://yohei:pass@blog.example.jp:8000/search?q=test&debug=true#n10
URIスキームの後ろには、ユーザ情報がある。
ユーザ情報は、このリソースにアクセスする際に利用するユーザ名とパスワードから成り立っています。
「:」で区切られています。
その次にはホスト情報がくる。
ホスト情報は、ホスト名とポート番号から成る。
ポート番号とは、このホストにアクセスするときのプロトコルで用いるTCPのポート番号を示します。
ポート番号を省略した場合は各プロトコルのデフォルト値が使われます。HTTPのデフォルト値は80番です。
パスの後ろには、?が続き名前=値形式のクエリが続きます。
この例では、q=testとdebug=trueがそれぞれクエリです。
クエリが複数あるときは、&でつなぎます
クエリはサーバにアクセスし情報を検索する時に使う検索キー。
この一つ以上のクエリの集合を「クエリパラメータ」という。
クエリパラメータは、検索サービスに検索キーワードを渡す時など、クライアントから動的にURIを生成するときに使用します。
最後に、#で始まる文字列は、「URIフラグメント」といい、その前までの文字列で表現するURIを指し示すリソース内部のさらに細かい部分を特定するときに利用します。
このリソースがHTML文書だった場合、id属性の値が「n10」である要素を示すことになります。
URLとURN
URIはURLとURNを総称する言葉です。
Uniform Resource Locater(URL)とUniform Resource Name(URN)
URLにはドメインを更新しなかったり、サーバが何らかの障害で変更になった場合などに、アクセスできなくなる問題がある。
その問題を解決するべく、URNが生まれました。URNはリソースにドメイン名とは独立した名前が付けられます。URNはドメイン名に依存しません。
この、URLとURNの要素を組み合わせた総称がURIなのです。
URLがLocater、つまり、リソースの場所を示すもの
URNがName、つまり、リソースの名前を示す者
URIがIdentifer、つまり、リソースを識別するもの
URIの設計
- URIにプログラミング言語依存の拡張子を利用しない
- URIに実装依存のパス名を利用しない(cgi-bin, servleyなど)
- URIにプログラミング言語のメソッド名を利用しない
- URIにセッションIDを利用しない
- URIはそのリソースを表現する名詞である。
マトリクスURI
階層式にリソースを表せない場合、マトリクスURIを使います。
階層構造を表現するスラッシュの代わりに、複数の軸のパラメータをそれぞれセミコロン(;)またはカンマ(,)で区切ってリソースを表現します。
例えば、Google Mapの場合、緯度と経度を使うと
https://www.google.co.jp/maps/place/lat=35.202902902;lng=183.1010011
とこんな感じで表せる。