From 9976783639acc8726c9a42741b6180cb1367dd35 Mon Sep 17 00:00:00 2001 From: Jeoffrey Haeyaert Date: Thu, 28 Mar 2019 22:14:28 +0100 Subject: [PATCH] WebClient uri method with uriTemplate and UriBuilder See gh-22705 --- .../reactive/function/client/DefaultWebClient.java | 6 ++++++ .../web/reactive/function/client/WebClient.java | 7 +++++++ .../function/client/DefaultWebClientTests.java | 12 ++++++++++++ 3 files changed, 25 insertions(+) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java index dd9408d732..d7ff00edce 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java @@ -184,6 +184,12 @@ class DefaultWebClient implements WebClient { return uri(uriBuilderFactory.expand(uriTemplate, uriVariables)); } + @Override + public RequestBodySpec uri(String uriTemplate, Function uriFunction) { + attribute(URI_TEMPLATE_ATTRIBUTE, uriTemplate); + return uri(uriFunction.apply(uriBuilderFactory.uriString(uriTemplate))); + } + @Override public RequestBodySpec uri(Function uriFunction) { return uri(uriFunction.apply(uriBuilderFactory.builder())); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClient.java index 4f17059bb1..ef511c9bb4 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClient.java @@ -348,9 +348,16 @@ public interface WebClient { */ S uri(String uri, Map uriVariables); + /** + * Build the URI for the request using the {@link UriBuilderFactory} + * configured for this client and initialized with the specified uri. + */ + S uri(String uri, Function uriFunction); + /** * Build the URI for the request using the {@link UriBuilderFactory} * configured for this client. + * @see #uri(String, Function) */ S uri(Function uriFunction); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultWebClientTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultWebClientTests.java index f62db48c0c..26167646b1 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultWebClientTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultWebClientTests.java @@ -84,6 +84,18 @@ public class DefaultWebClientTests { assertEquals("/base/path?q=12", request.url().toString()); } + + @Test + public void uriBuilderWithUriTemplate() { + this.builder.build().get() + .uri("/path/{id}", builder -> builder.queryParam("q", "12").build("identifier")) + .exchange().block(Duration.ofSeconds(10)); + + ClientRequest request = verifyAndGetRequest(); + assertEquals("/base/path/identifier?q=12", request.url().toString()); + assertEquals("/path/{id}", request.attribute(WebClient.class.getName() + ".uriTemplate").get()); + } + @Test public void uriBuilderWithPathOverride() { this.builder.build().get()