WebClient
Spring WebFlux 包含一个用于执行 HTTP 请求的客户端。WebClient
拥有一个基于 Reactor 的函数式、流畅的 API,详见Reactive Libraries,这使得可以声明式地组合异步逻辑,而无需处理线程或并发问题。它是完全非阻塞的,支持流式处理,并依赖于与服务器端用于编码和解码请求和响应内容的相同编解码器。
WebClient
需要一个 HTTP 客户端库来执行请求。内置支持以下内容:
-
其他可以通过
ClientHttpConnector
插入。
章节摘要
📄️ 配置
创建 WebClient 最简单的方法是通过其中一个静态工厂方法:
📄️ 检索()
retrieve() 方法可以用来声明如何提取响应。例如:
📄️ 交换
exchangeToMono() 和 exchangeToFlux() 方法(或在 Kotlin 中的 awaitExchange { } 和 exchangeToFlow { })对于需要更多控制的更高级情况非常有用,例如根据响应状态不同地解码响应:
📄️ 请求正文
请求体可以从任何由 ReactiveAdapterRegistry 处理的异步类型进行编码,例如 Mono 或 Kotlin 协程的 Deferred,如下例所示:
📄️ 过滤器
您可以通过 WebClient.Builder 注册一个客户端过滤器(ExchangeFilterFunction),以拦截和修改请求,如以下示例所示:
📄️ 属性
您可以向请求添加属性。如果您想通过过滤器链传递信息并影响给定请求的过滤器行为,这将非常方便。例如:
📄️ 上下文
属性提供了一种方便的方法来向过滤器链传递信息,但它们只影响当前请求。如果你想传递的信息需要传播到嵌套的其他请求(例如,通过 flatMap),或者在之后执行的请求(例如,通过 concatMap),那么你需要使用 Reactor Context。
📄️ 同步使用
WebClient 可以通过在末尾阻塞结果的方式以同步风格使用:
📄️ 测试
要测试使用 WebClient 的代码,可以使用模拟 Web 服务器,例如 OkHttp MockWebServer。要查看其使用示例,请查看 Spring Framework 测试套件中的 WebClientIntegrationTests 或 OkHttp 仓库中的 static-server 示例。