在 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条评论
点击登录参与评论