spring webClient配置及使用简单代码示例

 更新时间:2024年03月30日 08:31:51   作者:SmokyOranges  
WebClient是Spring框架5.0引入的基于响应式编程模型的HTTP客户端,它提供一种简便的方式来处理HTTP请求和响应,支持异步和非阻塞式的请求和响应处理,下面这篇文章主要给大家介绍了关于spring webClient配置及使用的相关资料,需要的朋友可以参考下

1.配置

import com.zty.common.util.WebUtils;
import io.netty.channel.ChannelOption;
import io.netty.handler.timeout.ReadTimeoutHandler;
import io.netty.handler.timeout.WriteTimeoutHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.resources.ConnectionProvider;

import java.time.Duration;

/**
 * WebClient配置
 * @author zty
 */
@Slf4j
@Configuration
public class WebClientConfig {

    @Bean
    public WebClient webClient(){
        //配置固定大小连接池
        ConnectionProvider provider = ConnectionProvider
                .builder("custom")
                // 等待超时时间
                .pendingAcquireTimeout(Duration.ofSeconds(10))
                // 最大连接数
                .maxConnections(200)
                // 最大空闲时间
                .maxIdleTime(Duration.ofSeconds(5))
                // 最大等待连接数量
                .pendingAcquireMaxCount(-1)
                .build();

        /**
         * doOnBind	当服务器channel即将被绑定的时候调用。
         * doOnBound	当服务器channel已经被绑定的时候调用。
         * doOnChannelInit	当channel初始化的时候被调用。
         * doOnConnection	当一个远程客户端连接上的时候被调用。
         * doOnUnbound	当服务器channel解绑的时候被调用。
         */
        HttpClient httpClient = HttpClient.create(provider)
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 6000)
                .option(ChannelOption.SO_KEEPALIVE, true)
                .responseTimeout(Duration.ofSeconds(6))
                .keepAlive(true)
                //连接成功
                .doOnConnected(connection -> connection.addHandlerLast(new ReadTimeoutHandler(6))
                        .addHandlerLast(new WriteTimeoutHandler(6)))
                //每次请求后执行flush,防止服务器主动断开连接
                .doAfterRequest((httpClientRequest, connection) -> {
                    connection.channel().alloc().buffer().release();
                    connection.channel().flush();
                    connection.channel().pipeline().flush();
                });

        return WebClient.builder()
                .baseUrl("http://127.0.0.1:8080")
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .defaultHeader(HttpHeaders.CONNECTION, "keep-alive")
                .clientConnector(new ReactorClientHttpConnector(httpClient))
                .build();
    }
}

2.使用

import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

import java.util.HashMap;

/**
 * http消息发送工具
 * @author zty
 */
@Slf4j
@Component
public class WebUtils {

    @Autowired
    WebClient webClient;

    @Async
    public void post(HashMap<String, Object> message){
        // 发送请求
        webClient.post()
                // 请求路径
                .uri("/test")
                // 携带参数
                .bodyValue(JSON.toJSONString(message))
                // 获取响应体
                .retrieve()
                // 响应数据类型转换
                .bodyToMono(String.class)
                .doOnError(throwable -> log.info(throwable.getMessage()))
                .onErrorResume(e -> Mono.just("Error " + e.getMessage()))
                // 异步
                .subscribe();
    }
}

附:一个带有多个查询参数的WebClient使用示例

import org.springframework.web.reactive.function.client.WebClient;

public class ExampleWebClient {

    public static void main(String[] args) {
        WebClient client = WebClient.create("https://api.example.com");

        client.get()
              .uri(uriBuilder -> uriBuilder.path("/search")
                                           .queryParam("q", "WebClient")
                                           .queryParam("page", 1)
                                           .queryParam("size", 20)
                                           .build())
              .retrieve()
              .bodyToMono(String.class)
              .subscribe(response -> System.out.println(response));
    }
}

在这个示例中,我们使用了uri()方法来构建URI。使用了一个Lambda表达式,在其中的uriBuilder对象(UriBuilder类型)中指定了路径和查询参数。在这个例子中,我们将/search作为路径,以及三个查询参数qpagesize来进行搜索,它们的值依次为WebClient(表示搜索关键字为WebClient)、120

最终的URI将会是一个类似于 https://api.example.com/search?q=WebClient&page=1&size=20 的字符串。在发送请求后,我们将响应体转换为String类型的Mono对象,并使用subscribe()方法输出响应内容。

总结 

到此这篇关于spring webClient配置及使用的文章就介绍到这了,更多相关spring webClient配置使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java并发编程之栅栏(CyclicBarrier)实例介绍

    Java并发编程之栅栏(CyclicBarrier)实例介绍

    这篇文章主要介绍了Java并发编程之栅栏(CyclicBarrier)实例介绍,栅栏类似闭锁,但是它们是有区别的,需要的朋友可以参考下
    2015-04-04
  • mybatis-plus调用update方法时,自动填充字段不生效问题及解决

    mybatis-plus调用update方法时,自动填充字段不生效问题及解决

    这篇文章主要介绍了mybatis-plus调用update方法时,自动填充字段不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Spring MVC中的常用注解及用法小结

    Spring MVC中的常用注解及用法小结

    这篇文章主要介绍了Spring MVC中的常用注解及其用法,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • Java实现带图形界面的聊天程序

    Java实现带图形界面的聊天程序

    这篇文章主要为大家详细介绍了Java实现带图形界面的聊天程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 如何在Mac上安装并配置JDK环境变量详细步骤

    如何在Mac上安装并配置JDK环境变量详细步骤

    这篇文章主要介绍了如何在Mac上安装并配置JDK环境变量详细步骤,包括下载JDK、安装JDK、配置环境变量、验证JDK配置以及可选地设置PowerShell为默认终端,需要的朋友可以参考下
    2025-04-04
  • 配置idea将Java与数据库连接起来实现一个简单的图书管理系统

    配置idea将Java与数据库连接起来实现一个简单的图书管理系统

    这篇文章主要给大家介绍了关于配置idea将Java与数据库连接起来实现一个简单的图书管理系统的相关资料,本文从基于Java的图书管理系统的背景、系统设计、数据库设计和系统实现等方面进行了详细的研究,需要的朋友可以参考下
    2023-12-12
  • SpringBoot整合Shiro的方法详解

    SpringBoot整合Shiro的方法详解

    Apache Shiro是一个java安全(权限)框架,Shiro可以非常容易的开发出足够好的应用,其不仅可以用在javase环境,也可以用在javaee环境。本文介绍了SpringBoot整合Shiro的方法,需要的可以参考一下
    2022-05-05
  • Java SpringBoot自定义starter详解

    Java SpringBoot自定义starter详解

    大家好,本篇文章主要讲的是Java SpringBoot自定义starter详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次
    2022-01-01
  • Java springboot里注解大全和使用指南(最新整理)

    Java springboot里注解大全和使用指南(最新整理)

    在Java Spring Boot中,注解是简化开发、提高效率的关键工具,这篇文章给大家介绍Java springboot里注解大全和使用指南,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2026-03-03
  • Java毕业设计实战之财务预算管理系统的实现

    Java毕业设计实战之财务预算管理系统的实现

    这是一个使用了java+SSM+Jsp+Mysql+Layui+Maven开发的财务预算管理系统,是一个毕业设计的实战练习,具有财务预算管理该有的所有功能,感兴趣的朋友快来看看吧
    2022-02-02

最新评论