web-dev-qa-db-fra.com

Quelle est la manière idiomatique de composer une URL ou une URI en Java?

Comment créer une URL ou un URI en Java? Existe-t-il un moyen idiomatique ou des bibliothèques qui le font facilement?

Je dois autoriser à partir d'une chaîne de requête, analyser/modifier diverses parties d'URL (schéma, hôte, chemin d'accès, chaîne de requête) et prendre en charge l'ajout et l'encodage automatique de paramètres de requête.

110
jon077

Utiliser HTTPClient a bien fonctionné.

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

}
29
jon077

À partir du composant HTTP Apache HttpClient 4.1.3, à partir du document officiel tutoriel :

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: à partir de la v4.2 URIUtils.createURI() est obsolète en faveur 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());
75
Chikei

En tant qu'auteur, je ne suis probablement pas la meilleure personne pour juger si mon constructeur d'URL/URI est bon , mais le voici quand même: https://github.com/mikaelhg/urlbuilder

Je voulais la solution complète la plus simple possible sans aucune dépendance en dehors du JDK. Je devais donc lancer la mienne.

61
Mikael Gueck
56
takete.dk

Il y a beaucoup de bibliothèques qui peuvent vous aider avec la construction d'URI (ne réinventez pas la roue). Voici trois pour vous aider à démarrer:


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.LELEASE

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

Voir aussi: Gist> Tests de générateur d'URI

9
Nick Grealy

Utilisez OkHttp

C'est 2019 et il existe une bibliothèque très populaire appelée OkHttp qui a été sélectionnée 32K fois sur GitHub. Avec cette bibliothèque, vous pouvez construire une URL comme ci-dessous:

import okhttp3.HttpUrl;

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

Après avoir été critiqué pour avoir suggéré la classe d'URL. Je vais suivre les conseils du commentateur et suggérer le classe d'URI à la place. Je vous suggère de regarder de près les constructeurs pour un URI car la classe est très immuable une fois créée.
Je pense que ce constructeur vous permet de définir tout ce dont vous pourriez avoir besoin dans l'URI.

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