Spring WebClient Filters
1.概述
在本教程中,我们将探索Spring WebFlux(一种功能性的反应式Web框架)中的WebClient过滤器。
2.请求过滤器
筛选器可以拦截,检查和修改客户端请求(或响应)。过滤器非常适合为每个请求添加功能,因为逻辑停留在一个地方。用例包括监视,修改,记录和验证客户端请求,仅举几例。
请求具有零个或多个过滤器的有序链。
在Spring Reactive中,过滤器是功能接口ExchangeFilterFunction的实例。筛选器函数具有两个参数:要修改的ClientRequest和下一个ExchangeFilterFunction。
通常,过滤器函数通过调用过滤器链中的下一个返回:
1 2 3 4 | ExchangeFilterFunction filterFunction = (clientRequest, nextFilter) -> { LOG.info("WebClient fitler executed"); return nextFilter.exchange(clientRequest); }; |
3. WebClient过滤
实现请求过滤器后,我们必须将其"附加"到WebClient实例。这只能在创建WebClient时完成。
接下来,让我们看看如何创建WebClient。第一种选择是使用或不使用基本URL来调用WebClient.create():
1 | WebClient webClient = WebClient.create(); |
不幸的是,这不允许添加过滤器。那么,第二个选择就是我们正在寻找的那个。
通过使用WebClient.builder(),我们可以添加过滤器:
1 2 3 | WebClient webClient = WebClient.builder() .filter(filterFunction) .build(); |
4.自定义过滤器
让我们从一个过滤器开始,该过滤器计算客户端发送的HTTP GET请求。
过滤器检查请求方法,并在GET请求的情况下增加"全局"计数器:
1 2 3 4 5 6 7 | ExchangeFilterFunction countingFunction = (clientRequest, nextFilter) -> { HttpMethod httpMethod = clientRequest.method(); if (httpMethod == HttpMethod.GET) { getCounter.incrementAndGet(); } return nextFilter.exchange(clientRequest); }; |
我们将定义的第二个过滤器将版本号附加到请求URL路径。我们利用ClientRequest.from()方法从当前请求对象创建一个新的请求对象,并设置修改后的URL。
随后,我们继续使用新的修改后的请求对象执行过滤器链:
1 2 3 4 5 6 7 8 | ExchangeFilterFunction urlModifyingFilter = (clientRequest, nextFilter) -> { String oldUrl = clientRequest.url().toString(); URI newUrl = URI.create(oldUrl +"/" + version); ClientRequest filteredRequest = ClientRequest.from(clientRequest) .url(newUrl) .build(); return nextFilter.exchange(filteredRequest); }; |
接下来,让我们定义一个过滤器来记录发送请求的方法及其URL。这些详细信息在请求对象中可用。
然后,我们要做的就是打印到一些输出流:
1 2 3 4 | ExchangeFilterFunction loggingFilter = (clientRequest, nextFilter) -> { printStream.print("Sending request" + clientRequest.method() +"" + clientRequest.url()); return nextFilter.exchange(clientRequest); }; |
5.标准过滤器
最后,让我们研究一下基本身份验证-请求过滤的一种非常常见的用例。
辅助类ExchangeFilterFunctions提供basicAuthentication()过滤器函数,该函数负责将授权标头添加到请求中。
结果,我们不需要为其定义过滤器:
1 2 3 | WebClient webClient = WebClient.builder() .filter(ExchangeFilterFunctions.basicAuthentication(user, password)) .build(); |
六,结论
在这篇简短的文章中,我们探讨了在Spring中过滤WebFlux客户端。
与往常一样,该代码示例可在GitHub上找到。