Добавить относительный URL к java.net.URL - PullRequest
32 голосов
/ 21 сентября 2011

При условии, что у меня есть объект java.net.URL, указывающий на, скажем,

http://example.com/myItems или http://example.com/myItems/

Есть ли где-нибудь помощник, чтобы добавить к этому некоторый относительный URL?Например, добавьте ./myItemId или myItemId, чтобы получить: http://example.com/myItems/myItemId

Ответы [ 13 ]

25 голосов
/ 06 ноября 2014

Этот не требует никаких дополнительных библиотек или кода и дает желаемый результат:

URL url1 = new URL("http://petstore.swagger.wordnik.com/api/api-docs");
URL url2 = new URL(url1.getProtocol(), url1.getHost(), url1.getPort(), url1.getFile() + "/pet", null);
System.out.println(url1);
System.out.println(url2);

Это печатает:

http://petstore.swagger.wordnik.com/api/api-docs
http://petstore.swagger.wordnik.com/api/api-docs/pet

Принятый ответ работает, только если нет путипосле хоста (ИМХО принятый ответ неверен)

25 голосов
/ 21 сентября 2011

URL имеет конструктор , который принимает базу URL и String spec.

В качестве альтернативы, java.net.URI придерживается более близко кстандартов, и имеет метод resolve, чтобы сделать то же самое.Создайте URI из вашего URL, используя URL.toURI.

6 голосов
/ 07 ноября 2014

Вот вспомогательная функция, которую я написал для добавления к пути URL:

public static URL concatenate(URL baseUrl, String extraPath) throws URISyntaxException, 
                                                                    MalformedURLException {
    URI uri = baseUrl.toURI();
    String newPath = uri.getPath() + '/' + extraPath;
    URI newUri = uri.resolve(newPath);
    return newUri.toURL();
}
4 голосов
/ 14 мая 2014

Я искал ответ на этот вопрос повсюду.Единственная реализация, которую я могу найти, находится в Android SDK: Uri.Builder .Я извлек его для своих собственных целей.

private String appendSegmentToPath(String path, String segment) {
  if (path == null || path.isEmpty()) {
    return "/" + segment;
  }

  if (path.charAt(path.length() - 1) == '/') {
    return path + segment;
  }

  return path + "/" + segment;
}

Это , где я нашел источник.

В сочетании с Apache URIBuilder Вот как я это использую: builder.setPath(appendSegmentToPath(builder.getPath(), segment));

3 голосов
/ 18 мая 2016

Вы можете использовать URIBuilder и метод URI#normalize, чтобы избежать дублирования / в URI:

URIBuilder uriBuilder = new URIBuilder("http://example.com/test");
URI uri = uriBuilder.setPath(uriBuilder.getPath() + "/path/to/add")
          .build()
          .normalize();
// expected : http://example.com/test/path/to/add
2 голосов
/ 11 января 2016

ОБНОВЛЕНО

Я считаю, что это самое короткое решение:

URL url1 = new URL("http://domain.com/contextpath");
String relativePath = "/additional/relative/path";
URL concatenatedUrl = new URL(url1.toExternalForm() + relativePath);
1 голос
/ 18 июня 2018

У меня были некоторые трудности с кодировкой URI. Аппендинг не работал для меня, потому что он имел тип содержимого: // и ему не нравился символ "/". Это решение не предполагает ни запроса, ни фрагмента (в конце концов, мы работаем с путями):

Код Котлина:

  val newUri = Uri.parse(myUri.toString() + Uri.encode("/$relPath"))
1 голос
/ 12 марта 2018

Вы можете просто использовать класс URI для этого:

import java.net.URI;
import org.apache.http.client.utils.URIBuilder;

URI uri = URI.create("http://example.com/basepath/");
URI uri2 = uri.resolve("./relative");
// => http://example.com/basepath/relative

Обратите внимание на косую черту на базовом пути и базовый относительный формат добавляемого сегмента. Вы также можете использовать класс URIBuilder из HTTP-клиента Apache:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.3</version>
</dependency>

...

import java.net.URI;
import org.apache.http.client.utils.URIBuilder;

URI uri = URI.create("http://example.com/basepath");
URI uri2 = appendPath(uri, "relative");
// => http://example.com/basepath/relative

public URI appendPath(URI uri, String path) {
    URIBuilder builder = new URIBuilder(uri);
    builder.setPath(URI.create(builder.getPath() + "/").resolve("./" + path).getPath());
    return builder.build();
}
1 голос
/ 06 февраля 2018

Объединить относительный путь к URI:

java.net.URI uri = URI.create("https://stackoverflow.com/questions")
java.net.URI res = uri.resolve(uri.getPath + "/some/path")

res будет содержать https://stackoverflow.com/questions/some/path

1 голос
/ 30 мая 2014

Некоторые примеры использования Apache URIBuilder http://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/org/apache/http/client/utils/URIBuilder.html:

Ex1:

String url = "http://example.com/test";
URIBuilder builder = new URIBuilder(url);
builder.setPath((builder.getPath() + "/example").replaceAll("//+", "/"));
System.out.println("Result 1 -> " + builder.toString());

Результат 1 -> http://example.com/test/example

Пример 2:

String url = "http://example.com/test";
URIBuilder builder = new URIBuilder(url);
builder.setPath((builder.getPath() + "///example").replaceAll("//+", "/"));
System.out.println("Result 2 -> " + builder.toString());

Результат 2 -> http://example.com/test/example

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