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

 更新时间:2024年03月30日 08:31:51   作者:SmokyOranges  
WebClient是Spring框架5.0引入的基于响应式编程模型的HTTP客户端,它提供一种简便的方式来处理HTTP请求和响应,支持异步和非阻塞式的请求和响应处理,下面这篇文章主要给大家介绍了关于spring?webClient配置及使用的相关资料,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

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配置使用内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • RocketMq消息队列之削峰详解

    RocketMq消息队列之削峰详解

    这篇文章主要介绍了RocketMq消息队列之削峰详解,MQ的主要特点为解耦、异步、削峰,本篇博客只是简单的记录RocketMQ削峰用法,用于减少数据库压力的业务场景,需要的朋友可以参考下
    2023-09-09
  • 出现java.util.ConcurrentModificationException 问题及解决办法

    出现java.util.ConcurrentModificationException 问题及解决办法

    这篇文章主要介绍了出现java.util.ConcurrentModificationException 问题及解决办法的相关资料,需要的朋友可以参考下
    2017-02-02
  • SpringBoot入坑笔记之spring-boot-starter-web 配置文件的使用

    SpringBoot入坑笔记之spring-boot-starter-web 配置文件的使用

    本篇向小伙伴介绍springboot配置文件的配置,已经全局配置参数如何使用的。需要的朋友跟随程序员之家小编一起学习吧
    2018-01-01
  • 详解快速搭建Spring Boot+Spring MVC

    详解快速搭建Spring Boot+Spring MVC

    本篇文章主要介绍了详解快速搭建Spring Boot+Spring MVC,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Java模拟qq软件的详细过程

    Java模拟qq软件的详细过程

    这篇文章主要为大家详细介绍了用Java实现模拟QQ,实现了消息通信+登陆界面美化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 浅谈Java解释器模式

    浅谈Java解释器模式

    这篇文章主要介绍了Java基于解释器模式实现定义一种简单的语言功能,简单描述了解释器模式的概念、功能及Java使用解释器模式定义一种简单语言的相关实现与使用技巧,需要的朋友可以参考下
    2021-10-10
  • 深入java垃圾回收的详解

    深入java垃圾回收的详解

    本篇文章是对java垃圾回收进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 图文详解SpringBoot中Log日志的集成

    图文详解SpringBoot中Log日志的集成

    这篇文章主要给大家介绍了关于SpringBoot中Log日志的集成的相关资料,文中通过实例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-12-12
  • SpringBoot2.x过后static下的静态资源无法访问的问题

    SpringBoot2.x过后static下的静态资源无法访问的问题

    这篇文章主要介绍了SpringBoot2.x过后static下的静态资源无法访问的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • java压缩文件与删除文件的示例代码

    java压缩文件与删除文件的示例代码

    这篇文章主要介绍了java压缩文件与删除文件的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08

最新评论

?


http://www.vxiaotou.com