Каков идиоматический способ составления URL или URI в Java?

Как создать URL или URI в Java? Есть ли идиоматический способ или библиотеки, которые легко это делают?

Мне нужно разрешить запуск из строки запроса, разбор/изменение различных частей URL (схема, хост, путь, строка запроса) и поддержка добавления и автоматического кодирования параметров запроса.

Ответ 1

Использование HTTPClient хорошо работает.

protected static String createUrl(List<NameValuePair> pairs) throws URIException{

  HttpMethod method = new GetMethod("http://example.org");
  method.setQueryString(pairs.toArray(new NameValuePair[]{}));

  return method.getURI().getEscapedURI();

}

Ответ 2

Как из HTTP-компонента Apache HttpClient 4.1.3, из официального tutorial:

public class HttpClientTest {
public static void main(String[] args) throws URISyntaxException {
    List<NameValuePair> qparams = new ArrayList<NameValuePair>();
    qparams.add(new BasicNameValuePair("q", "httpclient"));
    qparams.add(new BasicNameValuePair("btnG", "Google Search"));
    qparams.add(new BasicNameValuePair("aq", "f"));
    qparams.add(new BasicNameValuePair("oq", null));
    URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search",
                                 URLEncodedUtils.format(qparams, "UTF-8"), null);
    HttpGet httpget = new HttpGet(uri);
    System.out.println(httpget.getURI());
    //http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=
}
}

Изменить: начиная с версии v4.2 URIUtils.createURI() устарел в пользу URIBuilder:

URI uri = new URIBuilder()
        .setScheme("http")
        .setHost("www.google.com")
        .setPath("/search")
        .setParameter("q", "httpclient")
        .setParameter("btnG", "Google Search")
        .setParameter("aq", "f")
        .setParameter("oq", "")
        .build();
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());

Ответ 3

Как автор, я, вероятно, не лучший человек, чтобы судить, хорош ли мой URL/URI-конструктор, но здесь он тем не менее: https://github.com/mikaelhg/urlbuilder

Мне нужно простейшее возможное полное решение с нулевыми зависимостями вне JDK, поэтому мне пришлось сворачивать свои собственные.

Ответ 5

Существует множество библиотек, которые могут помочь вам в создании URI (не изобретайте колесо). Вот три, чтобы вы начали:


Java EE 7

import javax.ws.rs.core.UriBuilder;
...
return UriBuilder.fromUri(url).queryParam(key, value).build();

org.apache.httpcomponents: HttpClient: 4.5.2

import org.apache.http.client.utils.URIBuilder;
...
return new URIBuilder(url).addParameter(key, value).build();

org.springframework: spring-страница: 4.2.5.RELEASE

import org.springframework.web.util.UriComponentsBuilder;
...
return UriComponentsBuilder.fromUriString(url).queryParam(key, value).build().toUri();

Смотрите также: GIST>Тесты URI Builder

Ответ 6

Используйте OkHttp

Это 2019, и есть очень популярная библиотека с именем OkHttp, которая была отмечена 32K раз на GitHub. С помощью этой библиотеки вы можете создать URL, как показано ниже:

import okhttp3.HttpUrl;

URL url = new HttpUrl.Builder()
    .scheme("http")
    .host("example.com")
    .port(4567)
    .addPathSegment("foldername/1234")
    .addQueryParameter("abc", "xyz")
    .build().url();

Ответ 7

Ошибка (RFE) 6306820 в базе данных java-ошибок адресует это.

В одном из комментариев предоставляется ссылка на реализацию RFE.

Ответ 8

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

URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment)
          Constructs a hierarchical URI from the given components.

Ответ 9

класс URL имеет неплохие методы для создания URL-адреса.