Qual é a maneira idiomática para compor uma URL ou URI em Java?

votos
103

Como faço para construir uma URL ou um URI em Java? Existe uma maneira idiomática, ou bibliotecas que facilmente fazer isso?

Eu preciso para permitir que a partir de uma seqüência de solicitação, analisar / alterar várias partes de URL (esquema, anfitrião, trajeto, cadeia de consulta) e parâmetros de consulta de apoio adicionando e que codificam automaticamente.

Publicado 19/05/2009 em 15:29
fonte usuário
Em outras línguas...                            


9 respostas

votos
71

A partir de Apache HTTP Component httpclient 4.1.3, do oficial 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=
}
}

Edit: a partir de v4.2 URIUtils.createURI()foi preterido em favor de 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());
Respondeu 03/03/2012 em 18:17
fonte usuário

votos
58

Apache HTTPClient ?

Respondeu 19/05/2009 em 15:33
fonte usuário

votos
57

Como o autor, eu provavelmente não sou a melhor pessoa para julgar se o meu URL / construtor URI é bom , mas aqui, no entanto, é: https://github.com/mikaelhg/urlbuilder

Eu queria que a solução completa mais simples possível com zero dependências fora do JDK, então eu tinha que fazer a minha própria.

Respondeu 02/01/2012 em 23:59
fonte usuário

votos
29

Usando HTTPClient funcionou bem.

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

}
Respondeu 19/05/2009 em 21:16
fonte usuário

votos
4

Há uma abundância de bibliotecas que podem ajudá-lo com a construção URI (não reinventar a roda). Aqui estão três para você começar:


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: primavera-web: 4.2.5.RELEASE

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

Veja também: GIST> Testes construtor URI

Respondeu 13/04/2017 em 04:54
fonte usuário

votos
4

Bug (RFE) 6.306.820 no banco de dados java bug Endereços isso.

Em um dos comentários, um link para a implementação RFE é fornecido.

Respondeu 26/02/2010 em 15:08
fonte usuário

votos
2

Use OkHttp

É 2017 e há uma biblioteca muito popular chamado OkHttp que foi estrelou 20K vezes no GitHub. Com esta biblioteca, você pode construir uma URL como abaixo:

import okhttp3.HttpUrl;

URL url = new HttpUrl.Builder()
    .scheme("http")
    .host("example.com")
    .port(4567)
    .addPathSegments("foldername/1234")
    .addQueryParameter("abc", "xyz")
    .build().url();
Respondeu 25/05/2017 em 14:58
fonte usuário

votos
1

Depois de ter sido criticado por sugerir a classe URL. Vou seguir o conselho do comentarista e sugerir a classe URI vez. Eu sugiro que você olhar atentamente para os construtores para um URI como a classe é muito imutável, uma vez criado.
Eu acho que esse construtor permite definir tudo no URI que você poderia precisar.

URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment)
          Constructs a hierarchical URI from the given components.
Respondeu 29/02/2012 em 21:32
fonte usuário

votos
-3

A classe URL tem muito bons métodos para a construção de um URL.

Respondeu 19/05/2009 em 15:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more