wake-up-neo.com

RestTemplate: So senden Sie URL- und Abfrageparameter zusammen

Ich versuche, Pfadparameter und Abfrageparameter in einer URL zu übergeben, ich erhalte jedoch einen merkwürdigen Fehler. Unten ist der 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);

und meine URL wird http://test.com/Services/rest/%7Bid%7D/Identifier?name=myName

was soll ich tun, damit es funktioniert? Ich erwarte http://test.com/Services/rest/{id}/Identifier?name=myName, damit Params der URL eine ID hinzufügen

bitte vorschlagen. Danke im Voraus

32
Shiva

Ich würde buildAndExpand von UriComponentsBuilder verwenden, um alle Arten von URI-Parametern zu übergeben. 

Zum Beispiel:

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

Ein Problem mit der Antwort von Michal Foksa ist, dass zuerst die Abfrageparameter hinzugefügt und dann die Pfadvariablen erweitert werden. Wenn der Abfrageparameter Klammern enthält, z. {foobar}, dies führt zu einer Ausnahme.

Der sichere Weg ist, zuerst die Pfadvariablen zu erweitern und dann die Abfrageparameter hinzuzufügen:

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

Einzeilig mit TestRestTemplate.exchange-Funktion mit Parameterzuordnung.

restTemplate.exchange("/someUrl?id={id}", HttpMethod.GET, reqEntity, respType, ["id": id])

Die so initialisierte Param-Map ist a groovig Initialisierer *

0
K. O.