tag lib fmt example java url

java - fmt - tag lib jstl



¿Cuál es la forma idiomática de componer una URL o URI en Java? (9)

¿Cómo construyo una URL o URI en Java? ¿Hay una manera idiomática, o bibliotecas que hacen esto fácilmente?

Necesito permitir comenzar desde una cadena de solicitud, analizar / cambiar varias partes de URL (esquema, host, ruta, cadena de consulta) y admitir la adición y codificación automática de parámetros de consulta.


Use OkHttp

Es 2017 y hay una biblioteca muy popular llamada OkHttp que ha sido protagonizada 20K veces en GitHub. Con esta biblioteca, puedes construir una url como a continuación:

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


A partir de Apache HTTP Component HttpClient 4.1.3, del tutorial oficial:

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

Editar: a partir de v4.2 URIUtils.createURI() ha quedado en desuso en 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());


Como autor, probablemente no soy la mejor persona para juzgar si mi URL / URI Builder es bueno , pero aquí sigue siendo: https://github.com/mikaelhg/urlbuilder

Quería la solución completa más simple posible con cero dependencias fuera del JDK, así que tuve que hacer mi propia.


Después de ser criticado por sugerir la clase de URL. Tomaré el consejo del comentarista y sugeriré la clase URI en su lugar. Le sugiero que mire de cerca a los constructores para un URI ya que la clase es muy inmutable una vez creada.
Creo que este constructor te permite configurar todo lo que puedas necesitar en el URI.

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



Hay muchas bibliotecas que pueden ayudarlo con la construcción de URI (no reinvente la rueda). Aquí hay tres para que comiences:

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

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

Ver también: GIST> URI Builder Tests


La clase de URL tiene métodos bastante buenos para construir una URL.


Usar HTTPClient funcionó bien.

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