Перейти к основному содержимому

Получить доменное имя с заданного URL-адреса в Java

· 3 мин. чтения

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 .