1. 概述
在这篇短文中,我们将探讨在Java中从给定URL获取域名的不同方法。
2. 什么是域名?
简单来说,域名代表指向IP地址的字符串,它是统一资源定位符(URL)的一部分。通过域名,用户可以通过客户端软件访问特定的网站。
域名通常由两到三个部分组成,每个部分之间用点分隔。
从尾部开始,域名可能包括:
- **顶级域名(如:
com
在bealdung.com
中), - **二级域名(如:
co
在google.co.uk
或baeldung
在baeldung.com
中), - 三级域名(如:
google
在google.co.uk
中)
域名需要遵循域名系统(DNS)规定的规则和流程。
3. 使用URI类
让我们看看如何使用java.net.URI
类从URL中提取域名。URI
类提供了getHost()
方法,它返回URL的主机部分:
URI uri = new URI("https://www.baeldung.com/domain");
String host = uri.getHost();
assertEquals("www.baeldung.com", host);
主机包含子域以及三级、二级和顶级域名。
此外,为了获取域名,我们需要从给定的主机中移除子域:
String domainName = host.startsWith("www.") ? host.substring(4) : host;
assertEquals("baeldung.com", domainName);
然而,在某些情况下,我们不能使用URI
类获取域名。例如,如果我们不知道子域的确切值,就无法从中取出。
4. 使用Guava库的InternetDomainName类
现在,我们将看到如何使用Guava库和InternetDomainName
类来获取域名。
InternetDomainName
类提供了topPrivateDomain()
方法,它返回给定域名中公共后缀下一级的部分。换句话说,这个方法将返回顶级、二级和三级域名。
首先,我们需要从给定的URL值中提取主机。我们可以使用URI
类:
String urlString = "https://www.baeldung.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("baeldung.com", domainName);
与URI
类相比,InternetDomainName
会在返回的值中省略子域。
最后,我们还可以从给定的URL中移除顶级域名:
String publicSuffix = internetDomainName.publicSuffix().toString();
String name = domainName.substring(0, domainName.lastIndexOf("." + publicSuffix));
此外,让我们创建一个测试来检查功能:
assertEquals("baeldung", domainNameClient.getName("jira.baeldung.com"));
assertEquals("google", domainNameClient.getName("www.google.co.uk"));
我们可以看到,子域和顶级域名都被从结果中移除了。
5. 使用正则表达式
使用正则表达式获取域名可能会有挑战性。例如,如果我们不知道子域的确切值,就无法确定应该从给定URL中提取哪个单词(如果有)。
另一方面,如果我们知道子域值,我们可以使用正则表达式从URL中移除它:
String url = "https://www.baeldung.com/domain";
String domainName = url.replaceAll("http(s)?://|www\\.|/.*", "");
assertEquals("baeldung.com", domainName);
6. 总结
在这篇文章中,我们探讨了如何从给定URL中提取域名。如往常一样,示例代码可以在GitHub上找到。