From a5d27f0c2199bf7ef583bc22b4787c57bd1451d9 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Sun, 8 Jan 2023 09:50:13 +0530 Subject: [PATCH] BAEL-5884 - URI encoding with Rest Template (#13207) * BAEL-5884 - URI encoding with Rest Template * BAEL-5884 - URI encoding with Rest Template - indentation corrected --- .../com/baeldung/encoding/Application.java | 11 +++++++ .../encoding/UriEncodingInterceptor.java | 29 +++++++++++++++++++ .../encoding/config/RestTemplateConfig.java | 19 ++++++++++++ .../RestTemplateWithInterceptorsConfig.java | 20 +++++++++++++ .../encoding/service/HttpBinService.java | 27 +++++++++++++++++ .../service/HttpBinServiceUnitTest.java | 28 ++++++++++++++++++ 6 files changed, 134 insertions(+) create mode 100644 spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/Application.java create mode 100644 spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/UriEncodingInterceptor.java create mode 100644 spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateConfig.java create mode 100644 spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateWithInterceptorsConfig.java create mode 100644 spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/service/HttpBinService.java create mode 100644 spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/encoding/service/HttpBinServiceUnitTest.java diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/Application.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/Application.java new file mode 100644 index 0000000000..c6160a83d9 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/Application.java @@ -0,0 +1,11 @@ +package com.baeldung.encoding; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/UriEncodingInterceptor.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/UriEncodingInterceptor.java new file mode 100644 index 0000000000..0a4bf4dc42 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/UriEncodingInterceptor.java @@ -0,0 +1,29 @@ +package com.baeldung.encoding; + + +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.http.client.support.HttpRequestWrapper; +import org.springframework.web.util.UriComponentsBuilder; + +import java.io.IOException; +import java.net.URI; + +public class UriEncodingInterceptor implements ClientHttpRequestInterceptor { + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { + HttpRequest encodedRequest = new HttpRequestWrapper(request) { + @Override + public URI getURI() { + URI uri = super.getURI(); + String escapedQuery = uri.getRawQuery().replace("+", "%2B"); + return UriComponentsBuilder.fromUri(uri) + .replaceQuery(escapedQuery) + .build(true).toUri(); + } + }; + return execution.execute(encodedRequest, body); + } +} \ No newline at end of file diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateConfig.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateConfig.java new file mode 100644 index 0000000000..a39ba55ccc --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateConfig.java @@ -0,0 +1,19 @@ +package com.baeldung.encoding.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.DefaultUriBuilderFactory; + +@Configuration +public class RestTemplateConfig { + @Bean + public RestTemplate restTemplate() { + RestTemplate restTemplate = new RestTemplate(); + DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory(); + defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY); + restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory()); + return restTemplate; + } +} \ No newline at end of file diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateWithInterceptorsConfig.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateWithInterceptorsConfig.java new file mode 100644 index 0000000000..87c50f2e17 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateWithInterceptorsConfig.java @@ -0,0 +1,20 @@ +package com.baeldung.encoding.config; + +import com.baeldung.encoding.UriEncodingInterceptor; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +import java.util.Collections; + +@Configuration +public class RestTemplateWithInterceptorsConfig { + @Qualifier("restTemplateWithInterceptors") + @Bean + public RestTemplate restTemplateWithInterceptors() { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.setInterceptors(Collections.singletonList(new UriEncodingInterceptor())); + return restTemplate; + } +} diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/service/HttpBinService.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/service/HttpBinService.java new file mode 100644 index 0000000000..53cbb5e1a8 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/service/HttpBinService.java @@ -0,0 +1,27 @@ +package com.baeldung.encoding.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; + +@Service +public class HttpBinService { + private final RestTemplate restTemplate; + + public HttpBinService(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + public String get(String parameter) throws JsonProcessingException { + String url = "http://httpbin.org/get?parameter={parameter}"; + ResponseEntity response = restTemplate.getForEntity(url, String.class, parameter); + Map mapping = new ObjectMapper().readValue(response.getBody(), HashMap.class); + Map args = (Map) mapping.get("args"); + return args.get("parameter"); + } +} diff --git a/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/encoding/service/HttpBinServiceUnitTest.java b/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/encoding/service/HttpBinServiceUnitTest.java new file mode 100644 index 0000000000..c45f1991e5 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/encoding/service/HttpBinServiceUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.encoding.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class HttpBinServiceUnitTest { + @Autowired + private HttpBinService httpBinService; + + @Test + void givenWithoutPlusSign_whenGet_thenSameValueReturned() throws JsonProcessingException { + String parameterWithoutPlusSign = "springboot"; + String responseWithoutPlusSign = httpBinService.get(parameterWithoutPlusSign); + assertEquals(parameterWithoutPlusSign, responseWithoutPlusSign); + } + + @Test + void givenWithPlusSign_whenGet_thenSameValueReturned() throws JsonProcessingException { + String parameterWithPlusSign = "spring+boot"; + String responseWithPlusSign = httpBinService.get(parameterWithPlusSign); + assertEquals(parameterWithPlusSign, responseWithPlusSign); + } +} \ No newline at end of file