【SpringBoot WEB 系列】WebClient 之基础使用姿势

【SpringBoot WEB 系列】WebClient 之基础使用姿势

在使用AsyncRestTemplate来实现网络异步请求时,当时提到在 Spring5+之后,建议通过 WebClient 来取代 AsyncRestTemplate 来实现异步网络请求;

那么 WebClient 又是一个什么东西呢,它是怎样替代AsyncRestTemplate来实现异步请求的呢,接下来我们将进入 Spring Web 工具篇中,比较重要的 WebClient 系列知识点,本文为第一篇,基本使用姿势一览

I. 项目环境

我们依然采用 SpringBoot 来搭建项目,版本为 2.2.1.RELEASEmaven3.2作为构建工具,idea作为开发环境

1. pom 依赖

SpringBoot 相关的依赖就不贴出来了,有兴趣的可以查看源码,下面是关键依赖

<dependencies>
    <!-- 请注意这个引入,是最为重要的 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
</dependencies>

请注意一下上面的两个依赖包,对于使用WebClient,主要需要引入spring-boot-starter-webflux

2. 测试 REST 接口

接下来我们直接在这个项目中写几个用于测试的 REST 接口,因为项目引入的 webflux 的依赖包,所以我们这里也采用 webflux 的注解方式,新增用于测试的 GET/POST 接口

对于 WebFlux 用法不太清楚的小伙伴也没有关系,WebClient 的发起的请求,后端是基于传统的 Servlet 也是没有问题的;关于 WebFlux 的知识点,将放在 WebClient 系列博文之后进行介绍

@Data
public class Body {
    String name;
    Integer age;
}

@RestController
public class ReactRest {

    @GetMapping(path = "header")
    public Mono<String> header(@RequestHeader(name = "User-Agent") String userAgent,
            @RequestHeader(name = "ck", required = false) String cookie) {
        return Mono.just("userAgent is: [" + userAgent + "] ck: [" + cookie + "]");
    }

    @GetMapping(path = "get")
    public Mono<String> get(String name, Integer age) {
        return Mono.just("req: " + name + " age: " + age);
    }

    @GetMapping(path = "mget")
    public Flux<String> mget(String name, Integer age) {
        return Flux.fromArray(ne
<think>好的,用户想了解如何在Spring Boot使用WebClient进行HTTP请求,特别是GET和POST的示例代码。首先,我需要整理WebClient的基本使用方法,确保覆盖依赖添加、创建实例、发起请求的步骤。 首先,用户需要添加WebFlux依赖,因为WebClientSpring 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. **添加依赖** WebClientSpring 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); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值