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
作为路径,以及三个查询参数q
、page
、size
来进行搜索,它们的值依次为WebClient
(表示搜索关键字为WebClient
)、1
、20
。
最终的URI将会是一个类似于 https://api.example.com/search?q=WebClient&page=1&size=20
的字符串。在发送请求后,我们将响应体转换为String类型的Mono对象,并使用subscribe()
方法输出响应内容。
总结
到此这篇关于spring webClient配置及使用的文章就介绍到这了,更多相关spring webClient配置使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
javascript与jsp发送请求到servlet的几种方式实例
本文分别给出了javascript发送请求到servlet的5种方式实例与 jsp发送请求到servlet的6种方式实例2018-03-03Spring Boot 2.7.6整合redis与低版本的区别
这篇文章主要介绍了Spring Boot 2.7.6整合redis与低版本的区别,文中补充介绍了SpringBoot各个版本使用Redis之间的区别实例讲解,需要的朋友可以参考下2023-02-02SpringBoot 配合 SpringSecurity 实现自动登录功能的代码
这篇文章主要介绍了SpringBoot 配合 SpringSecurity 实现自动登录功能的代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-09-09springboot整合websocket最基础入门使用教程详解
这篇文章主要介绍了springboot整合websocket最基础入门使用教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-03-03
最新评论