Привет, Хабровчане! Рыская по интернетам, зашел на страницу про URI и спустя несколько часов осознал, как мало я знал об этом монстре. Признаюсь, до этого я думал, что URI это либо URL, либо URN, и мои познания ограничивались этой схемой:
Каково же было мое удивление, что в этой теме еще очень много нового. Начнем по порядку.
URI
URI (Uniform Resource Identifier) - унифицированный идентификатор ресурса. В кратце, он позволяет идентифицировать какой-либо ресурс: физический (https://assets.habr.com/habr-web/img/favicons/favicon-16.png - файл на сервере) или абстрактный (https://vk.com/settings - его не существует).
Сам по себе URI ничего нам не дает, это всего лишь "интерфейс" (выражаясь на ООП). Самое интересное нам дают его подтипы.
Его "интерфейс":
URI = [ схема ":" ] иерархическая-часть [ "?" запрос ] [ "#" фрагмент ]
URN
URN (Uniform Resource Name) - единообразное название ресурса. Может по одному только названию дать вам ресурс (также абстрактный или физический).
<URN> ::= "urn:" <NID> ":" <NSS>
<NID> - namespace identifier - идентификатор пространства.
<NSS> - namespace specific string - название ресурса в этом пространстве
Пример: urn:isbn:540609601X - идентификатор конкретной книги, так как ISBN - уникальный
URL
URL (Uniform Resource Locator) - унифицированный локатор ресурса. Говорит, где нам нужно найти ресурс. Наверное, в представлении не нуждается. Все мы используем его повседневно.
Теперь мы переходим к самым глубинам...
PURL
PURL (Persistent Uniform Resource Locator) - постоянный единообразный определитель ресурса.
Вспомним, что URL - говорит нам "куда идти, чтобы получить ресурс", но что делать если его: удалили, переместили, переименовали и т.д. Одним из решений может стать использование URN, но до этого пока далеко. Здесь нам на помощь и приходит PURL.
Его основная идея заключается в том, чтобы создать базу данных адресов PURL, которая будет отображать PURL на активный URL и перенаправлять на этот URL (Http Redirect, например).
<PURL> ::= <SCHEME> "://" <HOST> "/" <URL>
Как видно структура не особо отличается от старого доброго URL. Отличия в том, что HOST - сервер базы данных PURL, а URL - адрес ресурса, к которому хотим получить доступ.
Пример
Зарегистрированный адрес PURL
http://purl.russian-books.com/WarAndPeace/
Отображается на
http://your.web.server/your/web/root/
В результате, пришедший на адрес запрос
http://purl.russian-books.com/WarAndPeace/chapter12.html
Перенаправится на
http://your.web.server/your/web/root/chapter12.html
IRI
IRI (Internationalized Resource Identifier) - интернационализированный идентификатор ресурса. Позволяет записать адрес ресурса на любом языке мира.
Замечили ли вы, что русские буквы, пробелы и многие другие символы в URL кодируются странными символами на подобие: %D0%B7%D0%B0%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BE.
Это все из-за ограничений URL. Допустимые символы (RFC 3986):
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=
Чтобы обойти это ограничение создали IRI. В таком типе адресов используется Unicode вместо US-ASCII.
Таким образом, адрес
https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82
Превращается в
https://ru.wikipedia.org/wiki/Программист
XRI
XRI (Extensible Resource Identifier) - расширяемый идентификатор ресурса. Этот протокол создается OASIS. Этот протокол иммет глобальные цели, не умещающиеся в рамках 1 поста. Потому опишу его вкратце
XRI не только совместим с IRI и URI, но также является возможной заменой всей системы DNS и IP адресации! В протоколе фигурируют 2 слоя идентификаторов:
I-Number - постоянный адрес (этим схож с IP). Регистрируется на определенный ресурс и больше никогда не перерегистрируются (в отличие от разных IP для одного и того же сервера)
I-Name - удобочитаемый для человека адрес (этим схож с DNS). I-Name разрешается в I-Number.
В отличие от DNS адресация:
Неиерархическая одноранговая
Может иметь взаимные ссылки (cross-references) - один XRI вложен в другой и один логический ресурс может идентифицироваться в различных контекстах
Имеет глобальные реестры контекстов
= - частные лица
@ - организации
+ - общие понятия
Примеры
I-Names:
=Ivan.Petrov
@Yandex/(+programmer.id)
+phone.number
I-Numbers:
!!43534!A8C3/!D90F.88
!!1002!A7C5
Технический комитет по разработке был закрыт 8.07.2015, а сам протокол больше не находится в разработке.
Десерт
Вы наверное знаете, что существуют доменные имена на кириллице. Например, https://стопкоронавирус.рф.
Загвоздка в том, что для хранения доменного имени могут использоваться только цифры, символы латинского алфавита и "-" (всего 37 символов). Но как тогда используются домены .рф? Они используют другую систему DNS? Нет. Здесь используется алгоритм кодирования Punycode. Этот алгоритм преобразовывает Unicode последовательность в ACE последовательность, которую понимают DNS.
Алгоритм состоит из 2 шагов:
Перенести все исходные ASCII символы в результирующую строку (их не трогать)
Если есть не ASCII символы, то
Добавить в конец "-"
Последовательно кодировать все оставшиеся символы
Алгоритм описан в RFC 3492 и также на Википедии
Итог
Надеюсь вы узнали для себя, что-то новое и статья оказалась полезной. Как минимум теперь вы не будете утверждать, что "У URI есть только 2 союзника - URL и URN".