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
が必要なので、paramsがURLにidを追加します
提案してください。前もって感謝します
buildAndExpand
のUriComponentsBuilder
を使用して、すべてのタイプのURIパラメーターを渡します。
例えば:
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"
*/
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);
パラメータマップでTestRestTemplate.exchange関数を使用するワンライナー。
restTemplate.exchange("/someUrl?id={id}", HttpMethod.GET, reqEntity, respType, ["id": id])
このように初期化されたparamsマップは グルーヴィー 初期化子*