I have spring boot server with controller and one endpoint:
@GetMapping(path = "/readProperty", produces = "application/json") public ResponseEntity<ReferenceDataRestResponse> getReferenceDatav4 (WebRequest request) { Map<String, String[]> parametersMap = new HashMap<>(request.getParameterMap()); .... }
And another spring boot application which is sending request with restTemplate.getForEntity
String url = UriComponentsBuilder .fromHttpUrl(this.referenceDataBaseUrl) .path(this.referenceDataReadProperty) .queryParams(new LinkedMultiValueMap(multiValueParams)) .toUriString(); log.info("Reference data URL {}", url); ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(url, String.class);
info log with url prints this:
Reference data URL http://some-name:8080/readProperty?channel=E&service_name=Some%20Value
Problem is that when I call this endpoint with curl command and with restTemplate.getForEntity I receive different values for service_name param in controller
1. Curl
When I copy this url from log and call it with curl command like this:
curl 'http://some-name:8080/readProperty?channel=E&service_name=Some%20Value'
My endpoint is receiving service_name param as
Some Value
2. Java call with restTemplate.getForEntity(…)
When java is calling this url with:
ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(url, String.class, new Object[0]);
My endpoint is receiving service_name param as
Some%20Value
3. Question
How should I prepare request using spring boot to receive in controller decoded param?
Answer
Found an issue.
Url is encoded twice by java service. Once by toUriString(), second time by restTemplate.getForEntity
when I changed method which is sending request to:
String url = UriComponentsBuilder .fromHttpUrl(this.referenceDataBaseUrl) .path(this.referenceDataReadProperty) .queryParams(new LinkedMultiValueMap(multiValueParams)) .toString(); log.info("Reference data URL {}", url); ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(url, String.class);
Then it worked, parameter value have spaces instead of %20