java.net.URL doc 可以帮助您弄清楚如何“从完整网址中提取基本网址”
初步说明:
请注意来自URL javadoc page的这个重要提示:
"注意,URI 类在某些情况下确实会对其组件字段进行转义。管理 URL 编码和解码的推荐方法是使用 URI,并使用 toURI() 和 @987654324 在这两个类之间进行转换@。”
自解释单元测试:
这里有 2 个简单的单元测试来说明“基本网址”的概念
package com.elementique.web;
import org.junit.Test;
import java.net.URI;
import java.net.URL;
import static org.junit.Assert.assertEquals;
public class UrlTest {
@Test
public void baseUrlAuthority() throws Exception {
URL url = URI.create("http://username:password@host1:8080/directory/file?query#ref").toURL();
assertEquals("http", url.getProtocol()); // protocol is also known as 'scheme'
assertEquals("username:password@host1:8080", url.getAuthority());
String baseUrlAuthority= url.getProtocol() + "://" + url.getAuthority();
assert (url.toString().startsWith(baseUrlAuthority));
}
@Test
public void baseUrlHostAndDefaultPort() throws Exception {
URL url = URI.create("http://host2/a/b/c").toURL();
assertEquals(-1, url.getPort()); // -1 as port is not defined in this case
String baseUrlHostAndDefaultPort= url.getProtocol() + "://" + url.getHost();
assert (url.toString().startsWith(baseUrlHostAndDefaultPort));
}
}
提取基础网址:
所以,“从完整网址中提取基本网址”可以这样完成:
return url.getProtocol()+"://"+url.getAuthority()+"/"
或者这个,如果你不想要用户名/密码部分
if(url.getPort() == -1){ // port is not
return url.getProtocol()+"://"+url.getHost()+"/";
} else {
return url.getProtocol()+"://"+url.getHost()+":"+url.getPort()+"/";
}
实施:
这是一个实现(基于 getAuthority() ):
public static String getBaseUrl(String urlString)
{
if(urlString == null)
{
return null;
}
try
{
URL url = URI.create(urlString).toURL();
return url.getProtocol() + "://" + url.getAuthority() + "/";
}
catch (Exception e)
{
return null;
}
}
注意:
去掉尾随的“/”是你不想要的吗