URN:stä ja siihen liittyvästä aakkossopasta yksinkertaistaen

Sunday, September 18th, 2011

Käsitteet

URN (Uniform Resource Name) nimeää resurssin ottamatta kantaa sen saavutettavuuteen mukaan lukien saamismekanismin tai ‑osoitteen. URL (Uniform Resource Locator) paljastaa resurssin sijainnin ja protokollan, jota käyttäen sen saa käsiinsä. URI (Uniform Resource Identifier) on URL:n ja URN:n kattokäsite (“yliluokka”) siinä mielessä, että sekä URL että URN ovat URI-tyyppejä. THTTP on RFC:nsä otsikon mukaan “A Trivial Convention for using HTTP in URN Resolution”, ts. se tarjoaa keinot päästä käsiksi URN:n nimeämän resurssin URL:iin (tai resurssiin itseensä).

URN:n rakenne ja toiminnalliset vaatimukset

Dokumentin URN Syntax mukaan URN:n syntaksi on:

urn:<NID>:<NSS>

, missä NID ja NSS tulevat sanoista “Namespace Identifier” ja “Namespace Specific String”. NID alkaa alfanumeerisella merkillä, jota saa seurata korkeintaan 31 merkkiä, jotka ovat alfanumeerisia merkkejä tai “Ascii-yhdysmerkkejä” (U+002D). NSS saa sisältää melkein mitä vain.

Juha Hakala määrittelee NID:in ja NSS:n seuraavasti:

  • Nimiavaruus (NID eli Namespace Identifier). Koodi joka identifioi URN-tunnuksena käytetyn tunnusjärjestelmän.
  • Identifioiva osa (NSS eli Namespace Specific String). Julkaisun varsinainen tunnus kuten ISBN sijoitetaan tähän osaan.

NID:in tarkoitus on nimensä mukaisesti jakaa nimiavaruutta ja siten taata URN:ien ainutkertaisuus (yhdellä resurssilla voi olla monta URN:ia, mutta yksi URN saa viitata vain yhteen resurssiin).

URN:lle asetetaan erinäisiä ainutkertaisuus- ja pysyvyysvaatimuksia, toisin kuin URL:lle; niiden eron tässä suhteessa voi tiivistää hyvin karkeasti yksinkertaistaen vaikka näin:

URL saa muuttua, URN ei: sinä saat muuttaa, sinun URN:si (hetu) ei saa muuttua.

Miten löydetään URN:in tarkoittama resurssi?

Aiemmin mainittu RFC 2168 “A Trivial Convention for using HTTP in URN Resolution” määrittelee useita täsmäytysmekanismeja: nimestä osoitteeseen (tai moneen); nimestä nimiin; osoitteesta osoitteisiin ym., mutta tässä kiinnostumme vain yhdestä: miten täsmäytetään nimi (URN) osoitteeseen (URL), jonka avulla pääsemme käsiksi sanottuun resurssiin. Vastaus on hyvin suoraviivainen: jos tiedossamme on resurssimme nimi, ja HTTP-palvelin, joka suostuu paljastamaan resurssin sijainnin, pyydämme siltä HTTP-tapaan:

GET /uri-res/N2L?urn:foo:12345-54321 HTTP/1.1
Host: example.com

, mihin palvelin vastaa statuskoodilla 303 (tai 302, jos asiakas ymmärtää vain HTTP 1.0:n päälle) asettaen Location-otsikon arvoon, joka paljastaa sijainnin, kas näin:

Location: http://example.com/foo/12345-54321.html

Asiakas pyytää osoitetun resurssin internetiltä ja tekee sillä, mitä parhaaksi katsoo.