SpringBoot使用WebClient
时间: 2025-04-11 12:38:11 浏览: 25
<think>好的,用户想了解如何在Spring Boot中使用WebClient进行HTTP请求,特别是GET和POST的示例代码。首先,我需要整理WebClient的基本使用方法,确保覆盖依赖添加、创建实例、发起请求的步骤。
首先,用户需要添加WebFlux依赖,因为WebClient是Spring WebFlux的一部分。引用中的资料提到在POM中引入spring-boot-starter-webflux,这点很重要,必须包含进去。然后,创建WebClient实例有两种方式:直接使用create()方法或者通过Builder自定义配置,比如设置基础URL。
接下来是GET请求的处理。用户可能需要同步和异步两种方式的示例。根据引用中的代码,使用get()和uri()方法构建请求,然后retrieve()获取响应,最后用bodyToMono或bodyToFlux解析数据。同步请求需要调用block(),但需要注意这在响应式编程中不推荐,只在必要时使用。
然后是POST请求。需要构造请求体,可能使用MultiValueMap或者JSON对象。设置Content-Type头部是关键,比如application/x-www-form-urlencoded或application/json。示例代码中应该展示如何通过bodyValue传递数据,并处理响应。
还要考虑异常处理,比如使用onStatus方法处理特定HTTP状态码,这能提高代码的健壮性。此外,文件上传作为POST的一种变体,需要单独说明,展示如何使用multipart/form-data格式。
需要确保所有代码示例符合用户的引用资料,比如正确导入WebClient和Mono类,使用WebClient.create()方法。同时,提醒用户WebClient的异步特性,推荐使用响应式编程模式,避免阻塞主线程。
可能用户的问题还包括如何配置超时、日志记录或拦截器,但根据当前问题,先集中在GET和POST的基础使用。需要检查是否有遗漏的步骤,比如依赖配置是否正确,请求头设置是否完整,以及响应处理的常见方法。
最后,生成相关问题,帮助用户进一步学习,比如性能优化、异常处理、与RestTemplate的比较等。这些问题应基于用户可能的后续疑问,参考引用中的内容,确保覆盖相关主题。</think>### 如何在Spring Boot中使用WebClient发起HTTP请求
#### 1. **添加依赖**
WebClient是Spring WebFlux模块的一部分,需在`pom.xml`中引入:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
```
[^3]
---
#### 2. **创建WebClient实例**
- **默认实例**:直接通过`WebClient.create()`创建:
```java
private WebClient webClient = WebClient.create();
```
- **自定义实例**:通过`WebClient.builder()`配置基础URL或超时:
```java
private WebClient webClient = WebClient.builder()
.baseUrl("https://api.example.com")
.defaultHeader("User-Agent", "MyApp")
.build();
```
---
#### 3. **发起GET请求**
##### 同步GET请求(非推荐,仅示例)
```java
public String syncGet(String userId) {
return webClient.get()
.uri("/users/{id}", userId) // 路径参数
.retrieve()
.bodyToMono(String.class)
.block(); // 阻塞等待响应
}
```
##### 异步GET请求(推荐)
```java
public Mono<String> asyncGet(String userId) {
return webClient.get()
.uri("/users/{id}", userId)
.retrieve()
.bodyToMono(String.class); // 返回响应式流
}
```
[^2]
---
#### 4. **发起POST请求**
##### 表单提交(`x-www-form-urlencoded`)
```java
public Mono<String> postForm() {
MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
formData.add("name", "John");
formData.add("age", "30");
return webClient.post()
.uri("/submit")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.bodyValue(formData)
.retrieve()
.bodyToMono(String.class);
}
```
##### JSON数据提交
```java
public Mono<String> postJson() {
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("title", "Spring Boot");
requestBody.put("author", "Alice");
return webClient.post()
.uri("/books")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(requestBody)
.retrieve()
.bodyToMono(String.class);
}
```
##### 文件上传(`multipart/form-data`)
```java
public Mono<String> uploadFile(File file) {
MultipartBodyBuilder builder = new MultipartBodyBuilder();
builder.part("file", new FileSystemResource(file));
return webClient.post()
.uri("/upload")
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData(builder.build()))
.retrieve()
.bodyToMono(String.class);
}
```
---
#### 5. **处理异常**
通过`onStatus`方法处理特定HTTP状态码:
```java
public Mono<String> handleError() {
return webClient.get()
.uri("/error-endpoint")
.retrieve()
.onStatus(status -> status.is4xxClientError(),
response -> Mono.error(new RuntimeException("Client error")))
.bodyToMono(String.class);
}
```
---
###
阅读全文
相关推荐


















