Извлечь базовый URL из полного URL - PullRequest
5 голосов
/ 20 декабря 2010

Какой-нибудь быстрый способ извлечь базовый URL из полного URL? например, если у меня есть http://test.example.com/abcd/test.html - я хочу только http://test.example.com.

Я всегда могу выполнить разбор строк - но хотел знать, есть ли что-то в Ури, где я могу получить это напрямую.

Ответы [ 3 ]

24 голосов
/ 20 декабря 2010

А как же:

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
}
3 голосов
/ 22 мая 2014

java.net.URL Документ поможет вам понять, как "Извлечь базовый URL из полного URL"

Предварительное примечание:

Следует обратить внимание на это важное примечание со страницы javadoc URL :

"Примечание. Класс URI в некоторых случаях выполняет экранирование полей своего компонента. Рекомендуемый способ управления кодированием и декодированием URL-адресов заключается в использовании URI и преобразовании между этими двумя классами с использованием toURI () и URI.toURL () . "

Объяснительные юнит-тесты:

Вот два простых модульных теста, иллюстрирующих концепцию «базового URL»

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));
    }
}

Извлечение базового URL:

Итак, «извлечение базового URL из полного URL» можно сделать так:

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;
    }
}

Примечание:Удалите завершающий символ "/", если он вам не нужен

1 голос
/ 21 декабря 2010

В классе Android URI нет ничего, что давало бы вам базовый URL-адрес напрямую. Как предполагает gnuf, вам придется создать его как протокол + getHost ().

Способ разбора строк может быть проще и позволит вам избежать вставки всего в блок try / catch. Просто возьмите подстроку URL, начиная с начала строки и заканчивая третьим символом "/".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...