web-dev-qa-db-fra.com

RestTemplate: Comment envoyer des paramètres d'URL et de requête ensemble

J'essaie de transmettre les paramètres de chemin et de requête dans une URL, mais j'obtiens une erreur étrange. ci-dessous est le code

    String url = "http://test.com/Services/rest/{id}/Identifier"
    Map<String, String> params = new HashMap<String, String>();
    params.put("id", "1234");
    UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url)
                                        .queryParam("name", "myName");
    String uriBuilder = builder.build().encode().toUriString();
    restTemplate.exchange(uriBuilder , HttpMethod.PUT, requestEntity,
                    class_p, params);

et mon URL devient http://test.com/Services/rest/%7Bid%7D/Identifier?name=myName

que dois-je faire pour que cela fonctionne? Je m'attends à http://test.com/Services/rest/{id}/Identifier?name=myName pour que params ajoute id à l'URL

veuillez suggérer. Merci d'avance

32
Shiva

J'utiliserais buildAndExpand à partir de UriComponentsBuilder pour transmettre tous les types de paramètres d'URI. 

Par exemple:

String url = "http://test.com/solarSystem/planets/{planet}/moons/{moon}";

// URI (URL) parameters
Map<String, String> uriParams = new HashMap<String, String>();
uriParams.put("planets", "Mars");
uriParams.put("moons", "Phobos");

// Query parameters
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url)
        // Add query parameter
        .queryParam("firstName", "Mark")
        .queryParam("lastName", "Watney");

System.out.println(builder.buildAndExpand(uriParams).toUri());
/**
 * Console output:
 * http://test.com/solarSystem/planets/Mars/moons/Phobos?firstName=Mark&lastName=Watney
 */

restTemplate.exchange(builder.buildAndExpand(uriParams).toUri() , HttpMethod.PUT,
        requestEntity, class_p);

/**
 * Log entry:
 * org.springframework.web.client.RestTemplate Created PUT request for "http://test.com/solarSystem/planets/Mars/moons/Phobos?firstName=Mark&lastName=Watney"
 */
77
Michal Foksa

Un problème avec la réponse de Michal Foksa est qu’il ajoute d’abord les paramètres de requête, puis développe les variables de chemin. Si le paramètre de requête contient une parenthèse, par exemple, {foobar}, cela provoquera une exception.

La méthode la plus sûre consiste à développer d’abord les variables de chemin, puis à ajouter les paramètres de la requête:

String url = "http://test.com/Services/rest/{id}/Identifier";
Map<String, String> params = new HashMap<String, String>();
params.put("id", "1234");
URI uri = UriComponentsBuilder.fromUriString(url)
        .buildAndExpand(params)
        .toUri();
uri = UriComponentsBuilder
        .fromUri(uri)
        .queryParam("name", "myName")
        .build()
        .toUri();
restTemplate.exchange(uri , HttpMethod.PUT, requestEntity, class_p);
1
holmis83