Класс URI
- Все реализованные интерфейсы:
-
Serializable,Comparable<URI>
public final class URI extends Object implements Comparable<URI>, Serializable
Помимо некоторых незначительных отличий, указанных ниже, экземпляр этого класса представляет ссылку URI, как определено в RFC 2396: Универсальные идентификаторы ресурсов (URI): Общий синтаксис, дополненном RFC 2732: Формат для буквенных адресов IPv6 в URL-адресах. Формат буквенного адреса IPv6 также поддерживает scope_ids. Синтаксис и использование scope_ids описаны здесь. Этот класс предоставляет конструкторы для создания экземпляров URI из их компонентов или путём парсинга их строковых форм, методы для доступа к различным компонентам экземпляра и методы для нормализации, разрешения и относительного представления экземпляров URI. Экземпляры этого класса неизменяемы.
Синтаксис и компоненты URI
На высшем уровне ссылка URI (в дальнейшем просто "URI") в строковой форме имеет синтаксис[схемагде квадратные скобки [...] обозначают необязательные компоненты, а символы:]часть схемы[#фрагмент]
: и # обозначают сами себя. Абсолютный URI указывает схему; URI, который не является абсолютным, считается относительным. URI также классифицируются в зависимости от того, являются ли они непрозрачными или иерархическими.
Непрозрачный URI — это абсолютный URI, у которого часть схемы не начинается с символа косой черты ('/'). Непрозрачные URI не подлежат дальнейшему парсингу. Некоторые примеры непрозрачных URI:
mailto:java-net@www.example.comnews:comp.lang.javaurn:isbn:096139210x
Иерархический URI — это либо абсолютный URI, у которого часть схемы начинается с символа косой черты, либо относительный URI, то есть URI, который не указывает схему. Некоторые примеры иерархических URI:
http://example.com/languages/java/
sample/a/index.html#28
../../demo/b/index.html
file:///~/calendar
Иерархический URI подлежит дальнейшему парсингу в соответствии со синтаксисом
[схемагде символы:][//авторитет][путь][?запрос][#фрагмент]
:, /, ? и # обозначают сами себя. Часть схемы иерархического URI состоит из символов между компонентами схемы и фрагмента. Компонент авторитета иерархического URI, если указан, является либо серверным, либо реестровым. Серверный авторитет анализируется по знакомому синтаксису
[информация о пользователегде символы@]хост[:порт]
@ и : обозначают сами себя. Почти все схемы URI, используемые в настоящее время, являются серверными. Компонент авторитета, который не анализируется таким образом, считается реестровым. Компонент пути иерархического URI называется абсолютным, если он начинается с символа косой черты ('/'); в противном случае он является относительным. Путь иерархического URI, который либо является абсолютным, либо указывает авторитет, всегда является абсолютным.
В целом, экземпляр URI имеет следующие девять компонентов:
| Компонент | Тип |
|---|---|
| схема | String |
| часть схемы | String |
| авторитет | String |
| информация о пользователе | String |
| хост | String |
| порт | int |
| путь | String |
| запрос | String |
| фрагмент | String |
null, а неопределённые целочисленные компоненты — -1. Строковый компонент может быть определён таким образом, чтобы иметь пустую строку в качестве значения; это не эквивалентно тому, что этот компонент является неопределённым. Определён ли конкретный компонент в экземпляре или нет, зависит от типа представляемого URI. Абсолютный URI имеет компонент схемы. Непрозрачный URI имеет схему, часть схемы и, возможно, фрагмент, но не имеет других компонентов. Иерархический URI всегда имеет путь (хотя он может быть пустым) и часть схемы (которая по крайней мере содержит путь), и может иметь любые другие компоненты. Если компонент авторитета присутствует и является серверным, то компонент хоста будет определён, а компоненты информации о пользователе и порта могут быть определены.
Операции над экземплярами URI
Основные операции, поддерживаемые этим классом, — это нормализация, разрешение и относительное представление. Нормализация — это процесс удаления ненужных "." и ".." сегментов из компонента пути иерархического URI. Каждый "." сегмент просто удаляется. ".." сегмент удаляется только в том случае, если ему предшествует не-".." сегмент. Нормализация не влияет на непрозрачные URI.
Разрешение — это процесс разрешения одного URI по отношению к другому, базовому URI. Результирующий URI строится из компонентов обоих URI способом, указанным в RFC 2396, используя компоненты базового URI для тех, которые не указаны в оригинале. Для иерархических URI путь оригинала разрешается по отношению к пути базового, а затем нормализуется. Например, результат разрешения
sample/a/index.html#28 (1) по отношению к базовому URI http://example.com/languages/java/ — это результирующий URI http://example.com/languages/java/sample/a/index.html#28 Разрешение относительного URI ../../demo/b/index.html (2) по отношению к этому результату, в свою очередь, даёт http://example.com/languages/java/demo/b/index.html Поддерживается разрешение как абсолютных, так и относительных URI, а также абсолютных и относительных путей в случае иерархических URI. Разрешение URI file:///~calendar по отношению к любому другому URI просто даёт исходный URI, так как он абсолютный. Разрешение относительного URI (2) выше по отношению к относительному базовому URI (1) даёт нормализованный, но всё ещё относительный URI demo/b/index.html Относительное представление, наконец, можно рассматривать как обратную операцию разрешения. Пусть u — любой нормализованный абсолютный URI, заканчивающийся символом косой черты ('/') и v — любой нормализованный относительный URI, не начинающийся с точки ('.') или символа косой черты ('/'). Тогда следующее утверждение верно:
uПусть u — любой нормализованный абсолютный URI, заканчивающийся символом косой черты (.relativize(u.resolve(v)).equals(v)
'/') и v — любой нормализованный абсолютный URI. Тогда следующее утверждение верно: uЭта операция часто полезна при создании документа, содержащего URI, которые должны быть сделаны относительными к базовому URI документа, где это возможно. Например, относительное представление URI.resolve(u.relativize(v)).equals(v)
http://example.com/languages/java/sample/a/index.html#28 относительно базового URI http://example.com/languages/java/ даёт относительный URI sample/a/index.html#28. Категории символов
RFC 2396 точно определяет, какие символы разрешены в различных компонентах ссылки URI. Ниже используются следующие категории, большинство из которых взяты из этого спецификации, для описания этих ограничений:| Категория | Описание |
|---|---|
| alpha | Символы US-ASCII букв, 'A' до 'Z' и 'a' до 'z'
|
| digit | Символы US-ASCII десятичных цифр, '0' до '9'
|
| alphanum | Все символы alpha и digit |
| unreserved | Все символы alphanum вместе с теми, что в строке "_-!.~'()*"
|
| punct | Символы в строке ",;:$&+="
|
| reserved | Все символы punct вместе с теми, что в строке "?/[]@"
|
| escaped | Экранированные октеты, то есть тройки, состоящие из символа процента ('%') и двух шестнадцатеричных цифр ('0'-'9', 'A'-'F', и 'a'-'f') |
| other | Символы Unicode, которые не находятся в наборе символов US-ASCII, не являются управляющими символами (в соответствии с методом Character.isISOControl) и не являются пробельными символами (в соответствии с методом Character.isSpaceChar) (Отклонение от RFC 2396, которое ограничено US-ASCII)
|
Множество всех допустимых символов URI состоит из символов unreserved, reserved, escaped и other.
Экранированные октеты, кавычки, кодирование и декодирование
RFC 2396 разрешает экранированные октеты в компонентах информация о пользователе, путь, запрос и фрагмент. Экранирование служит двум целям в URI:Для кодирования символов, не являющихся US-ASCII, когда URI должен строго соответствовать RFC 2396, не содержа в себе другие символы.
Для котирования символов, которые в противном случае являются недопустимыми в компоненте. Компоненты пользовательской информации, пути, запроса и фрагмента несколько отличаются по набору допустимых и недопустимых символов.
Символ кодируется заменой его на последовательность экранированных октетов, представляющих этот символ в наборе символов UTF-8. Например, символ евро (€) кодируется как
"%E2%82%AC". (Отклонение от RFC 2396, который не определяет конкретный набор символов.)Недопустимый символ котируется, просто кодируясь. Например, символ пробела котируется заменой его на
"%20". UTF-8 содержит US-ASCII, поэтому для US-ASCII символов это преобразование имеет ровно тот же эффект, что и требуется RFC 2396.Последовательность экранированных октетов декодируется заменой её на последовательность символов, которую она представляет в наборе символов UTF-8. UTF-8 содержит US-ASCII, поэтому декодирование имеет эффект отмены котирования любых закотированных US-ASCII символов, а также декодирования любых закодированных символов, не являющихся US-ASCII. Если при декодировании экранированных октетов возникает ошибка декодирования, то ошибочные октеты заменяются на
'\uFFFD', универсальный символ замены Юникода.
Конструктор с одним аргументом требует котирования любых недопустимых символов в своём аргументе и сохраняет любые экранированные октеты и другие символы, которые присутствуют.
Конструкторы с множеством аргументов котируют недопустимые символы, как требуется компонентами, в которых они появляются. Символ процента (
'%') всегда котируется этими конструкторами. Любые другие символы сохраняются.Методы
getRawUserInfo,getRawPath,getRawQuery,getRawFragment,getRawAuthorityиgetRawSchemeSpecificPartвозвращают значения соответствующих компонентов в исходном виде, не интерпретируя экранированные октеты. Строки, возвращаемые этими методами, могут содержать как экранированные октеты, так и другие символы, и не будут содержать недопустимых символов.Методы
getUserInfo,getPath,getQuery,getFragment,getAuthorityиgetSchemeSpecificPartдекодируют любые экранированные октеты в соответствующих компонентах. Строки, возвращаемые этими методами, могут содержать как другие символы, так и недопустимые символы, и не будут содержать экранированных октетов.Метод
toStringвозвращает строку URI со всеми необходимыми котированиями, но которая может содержать другие символы.Метод
toASCIIStringвозвращает полностью закотированную и закодированную строку URI, которая не содержит никаких других символов.
Тождества
Для любого URI u всегда выполняется следующее:Для любого URI u, который не содержит избыточного синтаксиса, например, двух слешей перед пустым авторитетом (как вnew URI(u.toString()).equals(u).
file:///tmp/ ) или двоеточия после имени хоста, но без порта (как в http://www.example.com: ), и который не кодирует символы, кроме тех, которые должны быть закотированы, следующие тождества также выполняются:
new URI(u.getScheme(),
u.getSchemeSpecificPart(),
u.getFragment())
.equals(u) во всех случаях,
new URI(u.getScheme(),
u.getAuthority(),
u.getPath(), u.getQuery(),
u.getFragment())
.equals(u) если u иерархический, и
new URI(u.getScheme(),
u.getUserInfo(), u.getHost(), u.getPort(),
u.getPath(), u.getQuery(),
u.getFragment())
.equals(u) если u иерархический и не имеет авторитета или авторитета, основанного на сервере. URI, URL и URN
URI — это унифицированный идентификатор ресурса, а URL — унифицированный локатор ресурса. Следовательно, каждый URL является URI, абстрактно говоря, но не каждый URI является URL. Это связано с тем, что существует еще одна подкатегория URI — унифицированные имена ресурсов (URN), которые называют ресурсы, но не указывают, как их найти. URImailto, news, и isbn являются примерами URN. Концептуальное различие между URI и URL отражается в различиях между этим классом и классом URL.
Экземпляр этого класса представляет URI-ссылку в синтаксическом смысле, определенном RFC 2396. URI может быть абсолютным или относительным. Строка URI анализируется в соответствии с общим синтаксисом без учета схемы, если таковая имеется. Не выполняется поиск хоста, если таковой имеется, и не создается обработчик потока, зависящий от схемы. Равенство, хеширование и сравнение определяются строго с точки зрения текстового содержания экземпляра. Другими словами, экземпляр URI — это в основном структурированная строка, поддерживающая синтаксические, независимые от схемы операции сравнения, нормализации, разрешения и относительного преобразования.
Экземпляр класса URL, в свою очередь, представляет синтаксические компоненты URL вместе с некоторыми сведениями, необходимыми для доступа к ресурсу, который он описывает. URL должен быть абсолютным, то есть он всегда должен указывать схему. Строка URL анализируется в соответствии со своей схемой. Обработчик потоков всегда создается для URL, и фактически невозможно создать экземпляр URL для схемы, для которой нет обработчика. Равенство и хеширование зависят как от схемы, так и от интернет-адреса хоста, если таковой имеется; сравнение не определено. Другими словами, URL — это структурированная строка, которая поддерживает синтаксическую операцию разрешения, а также сетевые операции ввода-вывода по поиску хоста и установлению соединения с указанным ресурсом.
- Примечание API:
- Приложения, работающие с путями к файлам и URI файлов, должны проявлять особую осторожность, используя соответствующие методы для преобразования между ними. Метод-фабрика
Path.of(URI)и конструкторFile(URI)могут быть использованы для создания объектовPathилиFileиз URI файла.Path.toUri()иFile.toURI()могут быть использованы для созданияURIиз пути к файлу. Приложения никогда не должны пытаться создать, распарсить или разрешитьURIиз прямой строковой представления экземпляраFileилиPath.Некоторые компоненты URL или URI, такие как userinfo, могут быть использованы для создания вводящих в заблуждение URL или URI. Приложения, которые работают с URL или URI, должны учитывать рекомендации, изложенные в RFC3986, раздел 7, Рассмотрение вопросов безопасности.
- С:
- 1.4
- Внешние спецификации
- См. также:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
URI |
Создаёт URI, разобрав заданную строку. |
URI |
Создаёт URI из заданных компонентов. |
URI |
Создаёт иерархический URI из заданных компонентов. |
URI |
Создаёт иерархический URI из заданных компонентов. |
URI |
Создаёт иерархический URI из заданных компонентов. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
int |
compareTo |
Сравнивает этот URI с другим объектом, который должен быть URI. |
static URI |
create |
Создаёт URI, разобрав заданную строку. |
boolean |
equals |
Проверяет равенство этого URI с другим объектом. |
String |
getAuthority() |
Возвращает декодированный компонент authority этого URI. |
String |
getFragment() |
Возвращает декодированный компонент fragment этого URI. |
String |
getHost() |
Возвращает компонент host этого URI. |
String |
getPath() |
Возвращает декодированный компонент path этого URI. |
int |
getPort() |
Возвращает номер порта этого URI. |
String |
getQuery() |
Возвращает декодированный компонент query этого URI. |
String |
getRawAuthority() |
Возвращает необработанный компонент authority этого URI. |
String |
getRawFragment() |
Возвращает необработанный компонент fragment этого URI. |
String |
getRawPath() |
Возвращает необработанный компонент path этого URI. |
String |
getRawQuery() |
Возвращает необработанный компонент query этого URI. |
String |
getRawSchemeSpecificPart() |
Возвращает необработанную часть URI, специфичную для схемы. |
String |
getRawUserInfo() |
Возвращает необработанный компонент user-information этого URI. |
String |
getScheme() |
Возвращает компонент scheme этого URI. |
String |
getSchemeSpecificPart() |
Возвращает декодированную часть URI, специфичную для схемы. |
String |
getUserInfo() |
Возвращает декодированный компонент user-information этого URI. |
int |
hashCode() |
Возвращает значение хэш-кода для этого URI. |
boolean |
isAbsolute() |
Указывает, является ли этот URI абсолютным. |
boolean |
isOpaque() |
Указывает, является ли этот URI непрозрачным. |
URI |
normalize() |
Нормализует путь этого URI. |
URI |
parseServerAuthority() |
Пытается разобрать компонент authority этого URI, если он определён, на user-information, host и порт. |
URI |
relativize |
Относительствует заданный URI к этому URI. |
URI |
resolve |
Создаёт новый URI, разобрав заданную строку и разрешив её относительно этого URI. |
URI |
resolve |
Разрешает заданный URI относительно этого URI. |
String |
toASCIIString() |
Возвращает содержимое этого URI в виде строки US-ASCII. |
String |
toString() |
Возвращает содержимое этого URI в виде строки. |
URL |
toURL() |
Создаёт URL из этого URI. |
Подробное описание конструкторов
URI
public URI(String str) throws URISyntaxException
Этот конструктор анализирует заданную строку точно так, как указано в грамматике в RFC 2396, Приложение A, за исключением следующих отклонений:
Разрешено пустое поле авторитета, если за ним следует непустой путь, компонент запроса или компонент фрагмента. Это позволяет парсить URI, такие как
"file:///foo/bar", что, похоже, является целью RFC 2396, хотя грамматика этого не допускает. Если компонент авторитета пуст, то компоненты имя пользователя, хост и порт не определены.Разрешены пустые относительные пути; похоже, это соответствует намерениям RFC 2396, хотя грамматика этого не допускает. Основным следствием этого отклонения является то, что автономный фрагмент, такой как
"#foo", анализируется как относительный URI с пустым путём и заданным фрагментом и может быть полезно разрешён относительно базового URI.IPv4-адреса в компонентах хоста анализируются строго, как указано в RFC 2732: каждый элемент адреса в формате точка-тире должен содержать не более трёх десятичных цифр. Каждый элемент также ограничен значением, не превышающим 255.
-
Имена хостов в компонентах хоста, состоящих только из одной метки домена, разрешается начинать с символа alphanum. Это, похоже, соответствует намерениям раздела 3.2.2 RFC 2396, хотя грамматика этого не допускает. Следствием этого отклонения является то, что компонент авторитета иерархического URI, такого как
s://123, будет анализироваться как авторитет на основе сервера. IPv6-адреса разрешены для компонента хоста. IPv6-адрес должен быть заключён в квадратные скобки (
'['и']') как указано в RFC 2732. Сам IPv6-адрес должен анализироваться в соответствии с RFC 2373. IPv6-адреса дополнительно ограничены описанием не более шестнадцати байтов информации об адресе, ограничение, подразумеваемое в RFC 2373, но не выражаемое в грамматике.Символы в категории other разрешены там, где RFC 2396 допускает escaped октеты, то есть в компонентах имени пользователя, пути, запроса и фрагмента, а также в компоненте авторитета, если авторитет основан на реестре. Это позволяет URI содержать символы Юникода, выходящие за рамки набора символов US-ASCII.
- Параметры:
-
str- Строка, подлежащая разбору в URI - Исключения:
-
NullPointerException- Еслиstrявляетсяnull -
URISyntaxException- Если заданная строка нарушает RFC 2396, как дополнено вышеуказанными отклонениями - Внешние спецификации
URI
public URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) throws URISyntaxException
Если задан схему, то путь, если также задан, должен быть пустым или начинаться с символа косой черты ('/'). В противном случае компонент нового URI может быть оставлен неопределённым, передав null для соответствующего параметра или, в случае параметра port, передав -1.
Этот конструктор сначала строит строку URI из заданных компонентов в соответствии с правилами, указанными в RFC 2396, раздел 5.2, шаг 7:
Изначально строка результата пустая.
Если задана схема, то она добавляется к результату, за которой следует двоеточие (
':').Если заданы имя пользователя, хост или порт, то добавляется строка
"//".Если задано имя пользователя, то оно добавляется, за которым следует коммерческое «@» (
'@'). Любой символ, не входящий в категории unreserved, punct, escaped или other, записывается в кавычки.Если задан хост, то он добавляется. Если хост является литеральным IPv6-адресом, но не заключён в квадратные скобки (
'['и']'), то добавляются квадратные скобки.Если задан номер порта, то добавляется двоеточие (
':'), за которым следует номер порта в десятичной форме.Если задан путь, то он добавляется. Любой символ, не входящий в категории unreserved, punct, escaped или other, и не равный символу косой черты (
'/') или символу коммерческого «@» ('@'), записывается в кавычки.Если задан запрос, то добавляется знак вопроса (
'?'), за которым следует запрос. Любой символ, не являющийся законным символом URI, записывается в кавычки.Наконец, если задан фрагмент, то добавляется символ решётки (
'#'), за которым следует фрагмент. Любой символ, не являющийся законным символом URI, записывается в кавычки.
Полученная строка URI затем анализируется так, как будто вызывается конструктор URI(String), а затем вызывается метод parseServerAuthority() для результата; это может привести к выбросу URISyntaxException.
- Параметры:
-
scheme- Имя схемы -
userInfo- Имя пользователя и информация об авторизации -
host- Имя хоста -
port- Номер порта -
path- Путь -
query- Запрос -
fragment- Фрагмент - Исключения:
-
URISyntaxException- Если заданы схема и путь, но путь является относительным, если строка URI, созданная из заданных компонентов, нарушает RFC 2396 или если компонент авторитета строки присутствует, но не может быть проанализирован как авторитет на основе сервера - Внешние спецификации
URI
public URI(String scheme, String authority, String path, String query, String fragment) throws URISyntaxException
Если задан схему, то путь, если также задан, должен быть пустым или начинаться с символа косой черты ('/'). В противном случае компонент нового URI может быть оставлен неопределённым, передав null для соответствующего параметра.
Этот конструктор сначала строит строку URI из заданных компонентов в соответствии с правилами, указанными в RFC 2396, раздел 5.2, шаг 7:
Изначально строка результата пустая.
Если задана схема, то она добавляется к результату, за которой следует двоеточие (
':').Если задан авторитет, то добавляется строка
"//", за которой следует авторитет. Если авторитет содержит литеральный IPv6-адрес, то адрес должен быть заключён в квадратные скобки ('['и']'). Любой символ, не входящий в категории unreserved, punct, escaped или other, и не равный символу коммерческого «@» ('@'), записывается в кавычки.Если задан путь, то он добавляется. Любой символ, не входящий в категории unreserved, punct, escaped или other, и не равный символу косой черты (
'/') или символу коммерческого «@» ('@'), записывается в кавычки.Если задан запрос, то добавляется знак вопроса (
'?'), за которым следует запрос. Любой символ, не являющийся законным символом URI, записывается в кавычки.Наконец, если задан фрагмент, то добавляется символ решётки (
'#'), за которым следует фрагмент. Любой символ, не являющийся законным символом URI, записывается в кавычки.
Полученная строка URI затем анализируется так, как будто вызывается конструктор URI(String), а затем вызывается метод parseServerAuthority() для результата; это может привести к выбросу URISyntaxException.
- Параметры:
-
scheme- Имя схемы -
authority- Авторитет -
path- Путь -
query- Запрос -
fragment- Фрагмент - Исключения:
-
URISyntaxException- Если заданы схема и путь, но путь является относительным, если строка URI, созданная из заданных компонентов, нарушает RFC 2396 или если компонент авторитета строки присутствует, но не может быть проанализирован как авторитет на основе сервера - Внешние спецификации
URI
public URI(String scheme, String host, String path, String fragment) throws URISyntaxException
Компонент может быть не определён, передав null.
Этот удобный конструктор работает так, как если бы вы вызывали конструктор с семью аргументами следующим образом:
newURI(scheme, null, host, -1, path, null, fragment);
- Parameters:
-
scheme- Имя схемы -
host- Имя хоста -
path- Путь -
fragment- Фрагмент - Throws:
-
URISyntaxException- Если строка URI, построенная из заданных компонентов, нарушает RFC 2396
URI
public URI(String scheme, String ssp, String fragment) throws URISyntaxException
Компонент может быть не определён, передав null.
Этот конструктор сначала строит строку URI, используя заданные компоненты следующим образом:
Изначально, строка результата пустая.
Если задана схема, то она добавляется к результату, за которой следует двоеточие (
':').Если задана часть, специфичная для схемы, то она добавляется. Любой символ, который не является допустимым символом URI, квотируется.
Наконец, если задан фрагмент, то к строке добавляется символ решётки (
'#'), за которым следует фрагмент. Любой символ, который не является допустимым символом URI, квотируется.
Результирующая строка URI затем парсится, чтобы создать новый экземпляр URI, как если бы вы вызывали конструктор URI(String); это может вызвать исключение URISyntaxException.
- Parameters:
-
scheme- Имя схемы -
ssp- Часть, специфичная для схемы -
fragment- Фрагмент - Throws:
-
URISyntaxException- Если строка URI, построенная из заданных компонентов, нарушает RFC 2396
Подробное описание методов
create
public static URI create(String str)
Этот удобный фабричный метод работает так, как если бы вы вызывали конструктор URI(String); любое исключение URISyntaxException, брошенное конструктором, перехватывается и обертывается в новый объект IllegalArgumentException, который затем и бросается.
Этот метод предназначен для использования в ситуациях, когда известно, что данная строка является допустимым URI, например, для констант URI, объявленных в программе, и поэтому считается программистской ошибкой, если строка не парсится как таковая. Конструкторы, которые бросают URISyntaxException напрямую, должны использоваться в ситуациях, когда URI строится из пользовательского ввода или из другого источника, который может содержать ошибки.
- Parameters:
-
str- Строка, которая должна быть обработана в URI - Returns:
- Новый URI
- Throws:
-
NullPointerException- Еслиstrравноnull -
IllegalArgumentException- Если заданная строка нарушает RFC 2396
parseServerAuthority
public URI parseServerAuthority() throws URISyntaxException
Если компонент authority этого URI уже распознан как серверный, то он уже был разобран на компоненты user-information, host и port. В этом случае, или если у этого URI нет компонента authority, этот метод просто возвращает этот URI.
В противном случае этот метод ещё раз пытается разобрать компонент authority на компоненты user-information, host и port и выбрасывает исключение, описывающее, почему компонент authority не смог быть разобран таким образом.
Этот метод предоставляется, потому что общий синтаксис URI, указанный в RFC 2396, не всегда может отличить неправильный серверный authority от правильного authority реестра. Поэтому он должен рассматривать некоторые примеры первого как примеры второго. Компонент authority в строке URI "//foo:bar", например, не является законным серверным authority, но является законным в качестве authority реестра.
Во многих распространённых ситуациях, например, при работе с URI, которые известны как URN или URL, иерархические URI, которые используются, всегда будут серверными. Поэтому они должны быть обработаны как таковые или обработаны как ошибка. В этих случаях оператор
URIu= new URI(str).parseServerAuthority();
может использоваться для того, чтобы гарантировать, что u всегда относится к URI, который, если у него есть компонент authority, имеет серверный authority с правильными компонентами user-information, host и port. Вызов этого метода также гарантирует, что если authority не смог быть разобран таким образом, то соответствующее диагностическое сообщение может быть выведено на основе исключения, которое выбрасывается.
- Returns:
- URI, у которого поле authority обработано как серверный authority
- Throws:
-
URISyntaxException- Если компонент authority этого URI определён, но не может быть обработан как серверный authority в соответствии с RFC 2396 - External Specifications
normalize
public URI normalize()
Если этот URI непрозрачный или если его путь уже в нормальной форме, то возвращается этот URI. В противном случае создаётся новый URI, идентичный этому URI, за исключением того, что его путь вычисляется путём нормализации пути этого URI таким образом, что согласуется с RFC 2396, раздел 5.2, шаг 6, подшаги c-f; то есть:
Все
"."сегменты удаляются.Если
".."сегмент предшествует не-".."сегменту, то оба этих сегмента удаляются. Этот шаг повторяется до тех пор, пока он больше не применим.Если путь относительный, и если его первый сегмент содержит двоеточие (
':'), то префикс"."сегмент. Это предотвращает преобразование относительного URI с путём, например,"a:b/c/d"в дальнейшем в непрозрачный URI со схемой"a"и частью, специфичной для схемы,"b/c/d". (Отклонение от RFC 2396)
Нормализованный путь будет начинаться с одного или нескольких ".." сегментов, если недостаточно не-".." сегментов, предшествующих им, чтобы разрешить их удаление. Нормализованный путь будет начинаться с "." сегмента, если он был вставлен шагом 3 выше. В противном случае нормализованный путь не будет содержать "." или ".." сегментов.
- Returns:
- URI, эквивалентный этому URI, но с путём в нормальной форме
- External Specifications
resolve
public URI resolve(URI uri)
Если заданный URI уже абсолютный или если этот URI непрозрачный, то возвращается заданный URI.
Если у заданного URI определён компонент fragment, его компонент path пустой, а компоненты scheme, authority и query не определены, то возвращается URI с заданным фрагментом, но со всеми другими компонентами, равными компонентам этого URI. Это позволяет URI, представляющему автономную ссылку на фрагмент, такую как "#foo", быть полезно разрешённым относительно базового URI.
В противном случае этот метод строит новый иерархический URI, соответствующий RFC 2396, раздел 5.2; то есть:
Создаётся новый URI со схемой этого URI и компонентами query и fragment заданного URI.
Если у заданного URI есть компонент authority, то компонент authority и path нового URI берутся от заданного URI.
-
В противном случае компонент authority нового URI копируется из этого URI, а его путь вычисляется следующим образом:
Если путь заданного URI абсолютный, то путь нового URI берётся от заданного URI.
В противном случае путь заданного URI относительный, поэтому путь нового URI вычисляется путём разрешения пути заданного URI относительно пути этого URI. Это делается путём конкатенации всех, кроме последнего, сегмента пути этого URI, если таковой имеется, с путём заданного URI, а затем нормализуется результат, как если бы вы вызвали метод
normalize.
Результат этого метода абсолютный тогда и только тогда, когда либо этот URI абсолютный, либо заданный URI абсолютный.
- Parameters:
-
uri- URI, который разрешается относительно этого URI - Returns:
- Результат URI
- Throws:
-
NullPointerException- Еслиuriравенnull - External Specifications
resolve
public URI resolve(String str)
Этот удобный метод работает так, как будто его вызов эквивалентен оценке выражения resolve(URI.create(str)).
- Parameters:
-
str- Строка, которая должна быть проанализирована в URI - Returns:
- Результат URI
- Throws:
-
NullPointerException- Еслиstrявляетсяnull -
IllegalArgumentException- Если заданная строка нарушает RFC 2396
relativize
public URI relativize(URI uri)
Относительзация данного URI относительно этого URI вычисляется следующим образом:
Если либо этот URI, либо данный URI являются непрозрачными, или если схемы и компоненты авторизации двух URI не идентичны, или если путь этого URI не является префиксом пути данного URI, то возвращается данный URI.
В противном случае создаётся новый относительный иерархический URI с компонентами запроса и фрагмента, взятыми из данного URI, и с компонентом пути, вычисляемым путём удаления пути этого URI из начала пути данного URI.
- Parameters:
-
uri- URI, который будет относительзован к этому URI - Returns:
- Результат URI
- Throws:
-
NullPointerException- Еслиuriявляетсяnull
toURL
public URL toURL() throws MalformedURLException
Этот удобный метод работает так, как будто его вызов эквивалентен оценке выражения new URL(this.toString()) после предварительной проверки, что данный URI является абсолютным.
- Returns:
- URL, построенный из этого URI
- Throws:
-
IllegalArgumentException- Если данный URL не является абсолютным -
MalformedURLException- Если обработчик протокола для URL не был найден или произошла какая-либо другая ошибка во время построения URL
getScheme
public String getScheme()
Компонент схемы URI, если он определён, содержит только символы в категории alphanum и в строке "-.+". Схема всегда начинается с символа alpha.
Компонент схемы URI не может содержать закодированные октеты, поэтому этот метод не выполняет никакого декодирования.
- Returns:
- Компонент схемы данного URI или
null, если схема не определена
isAbsolute
public boolean isAbsolute()
URI является абсолютным тогда и только тогда, когда он имеет компонент схемы.
- Returns:
-
trueесли и только если данный URI является абсолютным
isOpaque
public boolean isOpaque()
URI является непрозрачным тогда и только тогда, когда он является абсолютным и его часть, специфичная для схемы, не начинается с символа косой черты ('/'). Непрозрачный URI имеет схему, часть, специфичную для схемы, и, возможно, фрагмент; все остальные компоненты не определены.
- Returns:
-
trueесли и только если данный URI является непрозрачным
getRawSchemeSpecificPart
public String getRawSchemeSpecificPart()
Часть URI, специфичная для схемы, содержит только допустимые символы URI.
- Returns:
- Исходная часть URI, специфичная для схемы (никогда не
null)
getSchemeSpecificPart
public String getSchemeSpecificPart()
Строка, возвращаемая этим методом, равна строке, возвращаемой методом getRawSchemeSpecificPart, за исключением того, что все последовательности закодированных октетов декодируются.
- Returns:
- Декодированная часть URI, специфичная для схемы (никогда не
null)
getRawAuthority
public String getRawAuthority()
Компонент авторизации URI, если он определён, содержит только символ коммерческой «at» ('@') и символы в категориях unreserved, punct, escaped и other. Если авторизация основана на сервере, она дополнительно ограничена допустимыми компонентами пользователя, хоста и порта.
- Returns:
- Исходный компонент авторизации данного URI или
null, если авторизация не определена
getAuthority
public String getAuthority()
Строка, возвращаемая этим методом, равна строке, возвращаемой методом getRawAuthority, за исключением того, что все последовательности закодированных октетов декодируются.
- Returns:
- Декодированный компонент авторизации данного URI или
null, если авторизация не определена
getRawUserInfo
public String getRawUserInfo()
Компонент информации о пользователе URI, если он определён, содержит только символы в категориях unreserved, punct, escaped и other.
- Returns:
- Исходный компонент информации о пользователе данного URI или
null, если информация о пользователе не определена
getUserInfo
public String getUserInfo()
Строка, возвращаемая этим методом, равна строке, возвращаемой методом getRawUserInfo, за исключением того, что все последовательности закодированных октетов декодируются.
- Returns:
- Декодированный компонент информации о пользователе данного URI или
null, если информация о пользователе не определена
getHost
public String getHost()
Компонент хоста URI, если он определён, будет иметь одну из следующих форм:
Имя домена, состоящее из одного или нескольких метки, разделённых точками (
'.'), необязательно за которым следует точка. Каждая метка состоит из символов alphanum, а также символов тире ('-'), хотя тире никогда не встречаются в качестве первого или последнего символа метки. Правая метка доменного имени, состоящего из двух или более меток, начинается с символа alpha.Четырехточечный IPv4-адрес в формате цифра
+.цифра+.цифра+.цифра+, где ни одна последовательность цифр не длиннее трёх символов и ни одна последовательность не имеет значения больше 255.IPv6-адрес, заключённый в квадратные скобки (
'['и']'), и состоящий из шестнадцатеричных цифр, двоеточий (':'), и, возможно, встроенного IPv4-адреса. Полный синтаксис IPv6-адресов указан в RFC 2373: Архитектура адресации IPv6.
- Returns:
- Компонент хоста данного URI или
null, если хост не определён - Внешние спецификации
getPort
public int getPort()
Компонент порта URI, если он определён, является неотрицательным целым числом.
- Returns:
- Компонент порта данного URI или
-1, если порт не определён
getRawPath
public String getRawPath()
Компонент пути URI, если он определён, содержит только символ косой черты ('/'), символ коммерческой «at» ('@') и символы в категориях unreserved, punct, escaped и other.
- Returns:
- Компонент пути данного URI или
null, если путь не определён
getPath
public String getPath()
Строка, возвращаемая этим методом, равна строке, возвращаемой методом getRawPath, за исключением того, что все последовательности закодированных октетов декодируются.
- Returns:
- Декодированный компонент пути данного URI или
null, если путь не определён
getRawQuery
public String getRawQuery()
Компонент запроса URI, если он определён, содержит только допустимые символы URI.
- Returns:
- Исходный компонент запроса данного URI или
null, если запрос не определён
getQuery
public String getQuery()
Строка, возвращаемая этим методом, равна строке, возвращаемой методом getRawQuery, за исключением того, что все последовательности закодированных октетов декодируются.
- Returns:
- Декодированный компонент запроса данного URI или
null, если запрос не определён
getRawFragment
public String getRawFragment()
Компонент фрагмента URI, если он определен, содержит только допустимые символы URI.
- Возвращает:
- Компонент фрагмента URI в исходном виде, или
nullесли фрагмент не определён
getFragment
public String getFragment()
Строка, возвращённая этим методом, равна строке, возвращённой методом getRawFragment, за исключением того, что все последовательности эскейпированных октетов декодируются.
- Возвращает:
- Декодированный компонент фрагмента этого URI, или
nullесли фрагмент не определён
equals
public boolean equals(Object ob)
Если данный объект не является URI, то метод сразу возвращает false.
Для равенства двух URI необходимо, чтобы оба были либо неявными, либо иерархическими. Их схемы должны быть либо обе не определены, либо равны без учёта регистра. Их фрагменты должны быть либо оба не определены, либо равны.
Для равенства двух неявных URI их компоненты, специфичные для схемы, должны быть равны.
Для равенства двух иерархических URI их пути должны быть равны, а их запросы должны быть либо оба не определены, либо равны. Их авторитеты должны быть либо оба не определены, либо оба основанные на реестре, либо оба основанные на сервере. Если их авторитеты определены и основаны на реестре, то они должны быть равны. Если их авторитеты определены и основаны на сервере, то их хосты должны быть равны без учёта регистра, их номера портов должны быть равны, а их компоненты пользовательской информации должны быть равны.
При проверке равенства компонентов пользовательской информации, пути, запроса, фрагмента, авторитета или компонента, специфичного для схемы, двух URI сравниваются их исходные формы, а не закодированные, и шестнадцатеричные цифры эскейпированных октетов сравниваются без учёта регистра.
Этот метод удовлетворяет общему соглашению метода Object.equals.
- Overrides:
-
equalsв классеObject - Параметры:
-
ob- Объект, с которым сравнивается этот объект - Возвращает:
-
trueтогда и только тогда, когда данный объект является URI, идентичным этому URI - См. также:
hashCode
public int hashCode()
Object.hashCode.- Overrides:
-
hashCodeв классеObject - Возвращает:
- Значение хэш-кода для этого URI
- См. также:
compareTo
public int compareTo(URI that)
При сравнении соответствующих компонентов двух URI, если один компонент не определён, а другой определён, то первый считается меньше второго. Если не указано иное, компоненты строк упорядочиваются в соответствии с их естественным, регистрозависимым порядком, как определено методом String.compareTo. Компоненты строк, которые подвержены кодировке, сравниваются путём сравнения их исходных форм, а не закодированных, и шестнадцатеричные цифры эскейпированных октетов сравниваются без учёта регистра.
Порядок URI определяется следующим образом:
Два URI с разными схемами упорядочиваются по порядку их схем без учёта регистра.
Иерархический URI считается меньше неявного URI с идентичной схемой.
Два неявных URI с идентичными схемами упорядочиваются по порядку их компонентов, специфичных для схемы.
Два неявных URI с идентичными схемами и компонентами, специфичными для схемы, упорядочиваются по порядку их фрагментов.
-
Два иерархических URI с идентичными схемами упорядочиваются по порядку их компонентов авторитета:
Если оба компонента авторитета основаны на сервере, то URIs упорядочиваются по порядку их компонентов пользовательской информации; если эти компоненты идентичны, то URIs упорядочиваются по порядку их хостов без учёта регистра; если хосты идентичны, то URIs упорядочиваются по порядку их портов.
Если один или оба компонента авторитета основаны на реестре, то URIs упорядочиваются по порядку их компонентов авторитета.
Наконец, два иерархических URI с идентичными схемами и компонентами авторитета упорядочиваются по порядку их путей; если их пути идентичны, то они упорядочиваются по порядку их запросов; если запросы идентичны, то они упорядочиваются по порядку их фрагментов.
Этот метод удовлетворяет общему соглашению метода Comparable.compareTo.
- Определено в:
-
compareToв интерфейсеComparable<URI> - Параметры:
-
that- Объект, с которым сравнивается этот URI - Возвращает:
- Отрицательное целое число, ноль или положительное целое число, если этот URI меньше, равен или больше данного URI
- Исключения:
-
ClassCastException- Если данный объект не является URI
toString
public String toString()
Если этот URI был создан путём вызова одного из конструкторов в этом классе, то возвращается строка, эквивалентная исходной строке ввода или строке, вычисленной из исходных компонентов, как соответствующим образом. В противном случае этот URI был создан путём нормализации, разрешения или релятивизации, и поэтому строка создаётся из компонентов этого URI в соответствии с правилами, указанными в RFC 2396, раздел 5.2, шаг 7.
- Overrides:
-
toStringв классеObject - Возвращает:
- Строковая форма этого URI
- Внешние спецификации
toASCIIString
public String toASCIIString()
Если этот URI не содержит символов в категории other, то вызов этого метода вернёт то же значение, что и вызов метода toString. В противном случае этот метод работает так, как если бы он вызывал этот метод, а затем кодировал результат.
- Возвращает:
- Строковая форма этого URI, закодированная в соответствии с потребностями, чтобы содержать только символы набора символов US-ASCII
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/net/URI.html