从完整网址中提取基本网址的快速方法是什么?例如,如果我有http://test.example.com/abcd/test.html - 我只想要http://test.example.com。
我总是可以进行字符串解析 - 但是想知道Uri中是否有东西我可以直接获取它。
答案 0 :(得分:24)
怎么样:
import java.net.URL;
import java.net.MalformedURLException;
try
{
URL url = new URL("http://test.example.com/abcd/test.html");
String baseUrl = url.getProtocol() + "://" + url.getHost();
}
catch (MalformedURLException e)
{
// do something
}
答案 1 :(得分:3)
java.net.URL doc可以帮助您弄清楚如何“从完整网址中提取基本网址”
初步说明:
应该注意来自URL javadoc page的重要提示:
“注意,在某些情况下,URI类会执行其组件字段的转义。管理URL编码和解码的推荐方法是使用URI,并使用toURI()在这两个类之间进行转换, URI.toURL()“。
自我解释单元测试:
以下是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;
}
}
注意:
删除尾随的“/”是你不想要它
答案 2 :(得分:1)
Android URI类中没有任何内容直接为您提供基本URL - 正如gnuf建议的那样,您必须将其构建为协议+ getHost()。
字符串解析方式可能更容易,并且可以避免在try / catch块中填充所有内容。只需获取URL的子字符串,从字符串的开头到第三个“/”符号。