1. Обзор
В этой короткой статье мы рассмотрим различные способы получения доменного имени из заданного URL-адреса в Java.
2. Что такое доменное имя?
Проще говоря, доменное имя представляет собой строку, указывающую на IP-адрес. Он является частью унифицированного указателя ресурсов (URL). Используя доменное имя, пользователи могут получить доступ к определенному веб-сайту через клиентское программное обеспечение.
Доменное имя обычно состоит из двух или трех частей, разделенных точкой.
Начиная с конца, доменное имя может включать:
- домен верхнего уровня (например,
com
вbealdung.com
), - домен второго уровня (например,
co
вgoogle.co.uk
илиforeach
вforeach.com
), - домен третьего уровня (например,
google
вgoogle.co.uk
)
Доменные имена должны соответствовать правилам и процедурам, определенным Системой доменных имен (DNS).
3. Использование класса URI
Давайте посмотрим, как извлечь доменное имя из URL-адреса с помощью класса java.net.URI .
Класс URI
предоставляет метод getHost()
, который возвращает хост-компонент URL:
URI uri = new URI("https://www.foreach.com/domain");
String host = uri.getHost();
assertEquals("www.foreach.com", host);
Хост содержит поддомен, а также домены третьего, второго и верхнего уровня.
Кроме того, чтобы получить доменное имя, нам нужно удалить поддомен с данного хоста:
String domainName = host.startsWith("www.") ? host.substring(4) : host;
assertEquals("foreach.com", domainName);
Однако в некоторых случаях мы не можем получить доменное имя с помощью класса URI .
Например, было бы невозможно удалить поддомен из URL-адреса, если мы не знаем его точное значение.
4. Использование класса InternetDomainName
из библиотеки Guava .
Теперь мы увидим, как получить доменное имя с помощью библиотеки Guava
и класса InternetDomainName .
Класс InternetDomainName
предоставляет метод topPrivateDomain()
, который возвращает часть заданного доменного имени, которая находится на один уровень ниже общедоступного суффикса. Другими словами, метод вернет домены верхнего, второго и третьего уровней.
Во-первых, нам нужно извлечь хост из заданного значения URL. Мы можем использовать класс URI :
String urlString = "https://www.foreach.com/java-tutorial";
URI uri = new URI(urlString);
String host = uri.getHost();
Далее, давайте получим доменное имя, используя класс InternetDomainName и его
метод topPrivateDomain()
:
InternetDomainName internetDomainName = InternetDomainName.from(host).topPrivateDomain();
String domainName = internetDomainName.toString();
assertEquals("foreach.com", domainName);
По сравнению с классом URI ,
InternetDomainName
будет опускать субдомен из возвращаемого значения.
Наконец, мы также можем удалить домен верхнего уровня из данного URL:
String publicSuffix = internetDomainName.publicSuffix().toString();
String name = domainName.substring(0, domainName.lastIndexOf("." + publicSuffix));
Кроме того, создадим тест, который проверит работоспособность:
assertEquals("foreach", domainNameClient.getName("jira.foreach.com"));
assertEquals("google", domainNameClient.getName("www.google.co.uk"));
Мы видим, что из результата удалены как поддомены, так и домены верхнего уровня.
5. Использование регулярных выражений
Получение доменного имени с помощью регулярных выражений может быть сложной задачей. Например, если мы не знаем точное значение поддомена, мы не можем определить, какое слово (если оно есть) должно быть извлечено из данного URL.
С другой стороны, если мы знаем значение поддомена, мы можем удалить его из URL-адреса с помощью регулярного выражения:
String url = "https://www.foreach.com/domain";
String domainName = url.replaceAll("http(s)?://|www\\.|/.*", "");
assertEquals("foreach.com", domainName);
6. Заключение
В этой статье мы рассмотрели, как извлечь доменное имя из заданного URL. Как всегда, исходный код примеров доступен на GitHub .