Add WebClient.filter method
This commit introduces a new method on WebClient: filter, which takes an filter function, and returns a (filtered) WebClient. Issue: SPR-14961
This commit is contained in:
parent
079eca9f63
commit
9e72033036
|
@ -95,6 +95,14 @@ class DefaultWebClientBuilder implements WebClient.Builder {
|
||||||
this.strategies));
|
this.strategies));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WebClient filter(ExchangeFilterFunction filter) {
|
||||||
|
Assert.notNull(filter, "'filter' must not be null");
|
||||||
|
|
||||||
|
ExchangeFilterFunction composedFilter = filter.andThen(this.filter);
|
||||||
|
|
||||||
|
return new DefaultWebClient(this.clientHttpConnector, this.strategies, composedFilter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class NoOpFilter implements ExchangeFilterFunction {
|
private class NoOpFilter implements ExchangeFilterFunction {
|
||||||
|
|
|
@ -50,6 +50,15 @@ public interface WebClient extends ExchangeFunction {
|
||||||
@Override
|
@Override
|
||||||
Mono<ClientResponse> exchange(ClientRequest<?> request);
|
Mono<ClientResponse> exchange(ClientRequest<?> request);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters this client with the given {@code ExchangeFilterFunction}, resulting in a filtered
|
||||||
|
* {@code WebClient}.
|
||||||
|
* @param filterFunction the filter to apply to this client
|
||||||
|
* @return the filtered client
|
||||||
|
* @see ExchangeFilterFunction#apply(ExchangeFunction)
|
||||||
|
*/
|
||||||
|
WebClient filter(ExchangeFilterFunction filterFunction);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new instance of {@code WebClient} with the given connector. This method uses
|
* Create a new instance of {@code WebClient} with the given connector. This method uses
|
||||||
|
|
|
@ -268,7 +268,7 @@ public class WebClientIntegrationTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void filter() throws Exception {
|
public void buildFilter() throws Exception {
|
||||||
HttpUrl baseUrl = server.url("/greeting?name=Spring");
|
HttpUrl baseUrl = server.url("/greeting?name=Spring");
|
||||||
this.server.enqueue(new MockResponse().setHeader("Content-Type", "text/plain").setBody("Hello Spring!"));
|
this.server.enqueue(new MockResponse().setHeader("Content-Type", "text/plain").setBody("Hello Spring!"));
|
||||||
|
|
||||||
|
@ -296,6 +296,35 @@ public class WebClientIntegrationTests {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void filter() throws Exception {
|
||||||
|
HttpUrl baseUrl = server.url("/greeting?name=Spring");
|
||||||
|
this.server.enqueue(new MockResponse().setHeader("Content-Type", "text/plain").setBody("Hello Spring!"));
|
||||||
|
|
||||||
|
ExchangeFilterFunction filter = (request, next) -> {
|
||||||
|
ClientRequest<?> filteredRequest = ClientRequest.from(request)
|
||||||
|
.header("foo", "bar").build();
|
||||||
|
return next.exchange(filteredRequest);
|
||||||
|
};
|
||||||
|
WebClient client = WebClient.create(new ReactorClientHttpConnector());
|
||||||
|
WebClient filteredClient = client.filter(filter);
|
||||||
|
|
||||||
|
ClientRequest<Void> request = ClientRequest.GET(baseUrl.toString()).build();
|
||||||
|
|
||||||
|
Mono<String> result = filteredClient.exchange(request)
|
||||||
|
.then(response -> response.body(toMono(String.class)));
|
||||||
|
|
||||||
|
StepVerifier.create(result)
|
||||||
|
.expectNext("Hello Spring!")
|
||||||
|
.expectComplete()
|
||||||
|
.verify();
|
||||||
|
|
||||||
|
RecordedRequest recordedRequest = server.takeRequest();
|
||||||
|
assertEquals(1, server.getRequestCount());
|
||||||
|
assertEquals("bar", recordedRequest.getHeader("foo"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void tearDown() throws Exception {
|
public void tearDown() throws Exception {
|
||||||
this.server.shutdown();
|
this.server.shutdown();
|
||||||
|
|
Loading…
Reference in New Issue