WebClient
Spring WebFlux包含一个用于执行HTTP请求的客户端。WebClient拥有基于Reactor的功能性强、语法流畅的API(详见Reactive Libraries),该API使得异步逻辑的声明式组合成为可能,而无需处理线程或并发问题。它完全是非阻塞的,支持流式处理,并且依赖于与服务器端用于编码和解码请求及响应内容相同的编码解码器。
WebClient 需要一个 HTTP 客户端库来执行请求。它内置支持以下几种:
-
其他组件可以通过
ClientHttpConnector进行集成。
部分概述
📄️ 配置
创建WebClient最简单的方法是通过其中一个静态工厂方法:
📄️ retrieve()
retrieve()方法可以用来声明如何提取响应内容。例如:
📄️ 交易所;交流;兑换
exchangeToMono() 和 exchangeToFlux() 方法(在 Kotlin 中对应为 awaitExchange { } 和 exchangeToFlow { })对于需要更多控制的高级场景非常有用,例如根据响应状态不同来以不同的方式解码响应:
📄️ 请求体
请求体可以从ReactiveAdapterRegistry处理的任何异步类型中编码,如下例所示,例如Mono或Kotlin Coroutines Deferred:
📄️ 过滤器
你可以通过WebClient.Builder注册一个客户端过滤器(ExchangeFilterFunction),以便拦截和修改请求,如下例所示:
📄️ 属性
您可以为请求添加属性。如果您希望通过过滤器链传递信息并影响特定请求的过滤器行为,这将非常方便。例如:
📄️ 上下文;环境;来龙去脉
属性提供了一种方便的方式将信息传递给过滤器链,但它们只影响当前请求。如果你想传递的信息能够传播到其他嵌套的请求中(例如,通过flatMap),或者在后续执行过程中被使用(例如,通过concatMap),那么你就需要使用Reactor Context。
📄️ 同步使用
WebClient可以通过在调用结束后阻塞来以同步的方式使用,从而获取结果:
📄️ 测试
要测试使用WebClient的代码,可以使用模拟Web服务器,例如OkHttp MockWebServer或WireMock。模拟Web服务器像普通服务器一样接受HTTP请求,这意味着你可以使用与生产环境中配置相同的HTTP客户端来进行测试,这一点很重要,因为不同的客户端在处理网络I/O时往往存在细微的差异。模拟Web服务器的另一个优点是能够结合生产环境中使用的客户端,在传输层模拟特定的网络问题和条件。