从完整网址中提取基本网址

时间:2010-12-20 19:09:53

标签: android

从完整网址中提取基本网址的快速方法是什么?例如,如果我有http://test.example.com/abcd/test.html - 我只想要http://test.example.com

我总是可以进行字符串解析 - 但是想知道Uri中是否有东西我可以直接获取它。

3 个答案:

答案 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的子字符串,从字符串的开头到第三个“/”符号。