From 6e77413b8fe3b95c8f2741a6ddde832fd8bc6b5d Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Mon, 19 Jul 2021 16:10:00 +0800 Subject: [PATCH] Expand relative URI for RestTemplate if possible It will make Spring Boot TestRestTemplate much more cleaner, save it from ubiquitous applyRootUriIfNecessary --- .../web/client/RestTemplate.java | 8 +++-- .../web/client/RestTemplateTests.java | 32 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java index 6cabd486269e..3fb167e0e825 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java @@ -100,6 +100,7 @@ * @author Juergen Hoeller * @author Sam Brannen * @author Sebastien Deleuze + * @author Yanming Zhou * @since 3.0 * @see HttpMessageConverter * @see RequestCallback @@ -727,7 +728,8 @@ else if (ext.getVarsMap() != null) { } } else { - return entity.getUrl(); + URI url = entity.getUrl(); + return url.isAbsolute() ? url : this.uriTemplateHandler.expand(url.toString()); } } @@ -800,7 +802,9 @@ public T execute(String uriTemplate, HttpMethod method, @Nullable RequestCal @Nullable public T execute(URI url, HttpMethod method, @Nullable RequestCallback requestCallback, @Nullable ResponseExtractor responseExtractor) throws RestClientException { - + if (!url.isAbsolute()) { + url = getUriTemplateHandler().expand(url.toString()); + } return doExecute(url, null, method, requestCallback, responseExtractor); } diff --git a/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java b/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java index f3ac6f9935c7..19fab07cf8eb 100644 --- a/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java @@ -41,6 +41,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpRequestFactory; @@ -79,6 +80,7 @@ * @author Rossen Stoyanchev * @author Brian Clozel * @author Sam Brannen + * @author Yanming Zhou */ @SuppressWarnings("unchecked") class RestTemplateTests { @@ -297,6 +299,36 @@ void getForObjectWithCustomUriTemplateHandler() throws Exception { verify(response).close(); } + @Test + void getForObjectWithCustomUriTemplateHandlerAndWithoutUriVariables() throws Exception { + DefaultUriBuilderFactory uriTemplateHandler = new DefaultUriBuilderFactory("https://example.com"); + template.setUriTemplateHandler(uriTemplateHandler); + mockSentRequest(GET, "https://example.com/hotels/1/pic/logo.png/size/150x150"); + mockResponseStatus(HttpStatus.OK); + given(response.getHeaders()).willReturn(new HttpHeaders()); + given(response.getBody()).willReturn(InputStream.nullInputStream()); + + String url = "/hotels/1/pic/logo.png/size/150x150"; + template.getForObject(URI.create(url), void.class); + + verify(response).close(); + } + + @Test + void exchangeWithCustomUriTemplateHandlerAndWithoutUriVariables() throws Exception { + DefaultUriBuilderFactory uriTemplateHandler = new DefaultUriBuilderFactory("https://example.com"); + template.setUriTemplateHandler(uriTemplateHandler); + mockSentRequest(GET, "https://example.com/hotels/1/pic/logo.png/size/150x150"); + mockResponseStatus(HttpStatus.OK); + given(response.getHeaders()).willReturn(new HttpHeaders()); + given(response.getBody()).willReturn(InputStream.nullInputStream()); + + String url = "/hotels/1/pic/logo.png/size/150x150"; + template.exchange(RequestEntity.method(GET, URI.create(url)).build(), void.class); + + verify(response).close(); + } + @Test void headForHeaders() throws Exception { mockSentRequest(HEAD, "https://example.com");