IT-Swarm.Net

RestTemplate : URL과 쿼리 매개 변수를 함께 보내는 방법

URL에서 경로 매개 변수 및 쿼리 매개 변수를 전달하려고하는데 이상한 오류가 발생합니다. 아래는 코드입니다

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

내 URL이 http://test.com/Services/rest/%7Bid%7D/Identifier?name=myName

작동하려면 어떻게해야합니까? http://test.com/Services/rest/{id}/Identifier?name=myName 매개 변수가 URL에 ID를 추가 할 것으로 예상됩니다.

제안하십시오. 미리 감사드립니다

39
Shiva

모든 유형의 URI 매개 변수를 전달하기 위해 buildAndExpandUriComponentsBuilder을 사용합니다.

예를 들면 다음과 같습니다.

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

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

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

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

restTemplate.exchange(builder.buildAndExpand(urlParams).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"
 */
95
Michal Foksa

Michal Foksa의 답변에 대한 문제는 쿼리 매개 변수를 먼저 추가 한 다음 경로 변수를 확장한다는 것입니다. 검색어 매개 변수에 괄호가 포함 된 경우 (예 : {foobar}, 예외가 발생합니다.

안전한 방법은 경로 변수를 먼저 확장 한 다음 쿼리 매개 변수를 추가하는 것입니다.

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);
5
holmis83

매개 변수 맵과 함께 TestRestTemplate.exchange 함수를 사용하는 하나의 라이너.

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

이처럼 초기화 된 params map은 멋진, 근사한 이니셜 라이저 *

0
K. O.