14

I am using REST template to intentionally send a % in request uri, something like /items/a%b

String responseEntity = restTemplate.exchange("/items/a%b",
             requestObj.getHttpMethod(), requestEntity, String.class);

The restTemplate is converting the endoding of this uri and it is becoming /items/a%25b which makes sense as the rest template by default encodes the uri.

I tried using UriComponent for disabling the encoding of the uri

UriComponents uriComponents = UriComponentsBuilder.fromPath("/items/a%b").build();
URI uri= uriComponents.toUri();

String responseEntity = restTemplate.exchange(uri,
             requestObj.getHttpMethod(), requestEntity, String.class);

But this is not working as the uri again is of type URI which do the encoding. I am sure I am not using the UriComponents the right way.

I would really appreciate if anyone could point out what's the right way of disabling the encoding.

Thanks.

Xstian
  • 8,184
  • 10
  • 42
  • 72
tintin
  • 5,676
  • 15
  • 68
  • 97

2 Answers2

12

from the UriComponentsBuilder doc, exists method build(boolean encoded)

build(boolean encoded) Builds a UriComponents instance from the various components contained in this builder.

UriComponents uriComponents = UriComponentsBuilder.fromPath("/items/a%b").build(true);
Nikolay Rusev
  • 4,060
  • 3
  • 19
  • 29
  • 1
    This is the best answer when you don't want to stop encoding on all `RestTemplate` usages. – Smile Jan 19 '22 at 08:58
11

I feel this is best way to disable encoding in RestTemplate which works fine for me

@Bean
public RestTemplate getRestTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory();
    defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);
    restTemplate.setUriTemplateHandler(defaultUriBuilderFactory);
    return restTemplate;
}
Abhishek
  • 3,348
  • 3
  • 15
  • 34