在 Spring Boot 中,WebClient 是 Spring WebFlux 提供的一个非阻塞、响应式的 HTTP 客户端,用于与 RESTful 服务或其他 HTTP 服务交互。相比于传统的 RestTemplate,WebClient 更加现代化,支持异步和非阻塞的特性,适合高性能、高并发的应用场景。
以下是 Spring Boot 整合 WebClient 的详细步骤和示例:
1. 引入依赖
在 pom.xml 中引入 spring-boot-starter-webflux 依赖,以支持 WebClient 的使用:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>
2. 配置 WebClient
可以通过 @Bean 将 WebClient 注入到 Spring 容器中,并配置默认的 baseUrl、超时时间等参数:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.client.WebClient; @Configuration public class WebClientConfig { @Bean public WebClient webClient() { return WebClient.builder() .baseUrl("https://api.example.com") // 设置默认的 baseUrl .build(); } }
3. 使用 WebClient 发送请求
WebClient 支持同步和异步的调用方式,以下是常见的 HTTP 请求示例:
3.1 GET 请求
import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @Service public class MyService { private final WebClient webClient; public MyService(WebClient webClient) { this.webClient = webClient; } public Mono<String> getData() { return webClient.get() .uri("/data") // 相对路径 .retrieve() .bodyToMono(String.class); // 将响应体转换为 Mono<String> } }
3.2 POST 请求
import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @Service public class MyService { private final WebClient webClient; public MyService(WebClient webClient) { this.webClient = webClient; } public Mono<String> postData(String jsonData) { return webClient.post() .uri("/data") .contentType(MediaType.APPLICATION_JSON) .bodyValue(jsonData) // 设置请求体 .retrieve() .bodyToMono(String.class); } }
3.3 PUT 请求
import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @Service public class MyService { private final WebClient webClient; public MyService(WebClient webClient) { this.webClient = webClient; } public Mono<Void> updateData(String jsonData) { return webClient.put() .uri("/data/1") .contentType(MediaType.APPLICATION_JSON) .bodyValue(jsonData) .retrieve() .bodyToMono(Void.class); } }
3.4 DELETE 请求
import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @Service public class MyService { private final WebClient webClient; public MyService(WebClient webClient) { this.webClient = webClient; } public Mono<Void> deleteData() { return webClient.delete() .uri("/data/1") .retrieve() .bodyToMono(Void.class); } }
4. 高级功能
WebClient 提供了许多高级功能,例如:
4.1 流式处理
可以使用 bodyToFlux 处理流式响应:
import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Flux; @Service public class MyService { private final WebClient webClient; public MyService(WebClient webClient) { this.webClient = webClient; } public Flux<String> getStreamData() { return webClient.get() .uri("/stream-data") .retrieve() .bodyToFlux(String.class); // 将响应体转换为 Flux<String> } }
4.2 自定义请求头
可以通过 header 方法添加自定义请求头:
webClient.get() .uri("/data") .header("Authorization", "Bearer token") .retrieve() .bodyToMono(String.class);
4.3 超时配置
可以通过 ClientHttpConnector 配置超时时间:
import org.springframework.http.client.reactive.ReactorClientHttpConnector; import reactor.netty.http.client.HttpClient; import java.time.Duration; @Bean public WebClient webClient() { HttpClient httpClient = HttpClient.create() .responseTimeout(Duration.ofSeconds(10)); // 设置超时时间 return WebClient.builder() .clientConnector(new ReactorClientHttpConnector(httpClient)) .build(); }
5. 应用场景
WebClient 适用于以下场景:
微服务通信:在微服务架构中,服务之间需要通过 HTTP 进行通信。
高并发场景:WebClient 的非阻塞特性使其适合处理大量并发请求。
流式数据处理:支持流式响应,适合处理实时数据。
6. 总结
WebClient 是 Spring Boot 中用于 HTTP 请求的现代化工具,支持非阻塞和响应式编程模型。通过合理配置和使用,可以显著提升系统的性能和响应速度。
0条评论
点击登录参与评论