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配置使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
springboot项目拦截前端请求中的特殊字符串(解决方案)
springboot项目中,需要对前端请求数据进行过滤,拦截特殊字符,本文通过实例代码给大家分享完美解决方案,感兴趣的朋友一起看看吧2023-10-10
PowerJob的ServerDiscoveryService工作流程源码解读
这篇文章主要为大家介绍了PowerJob的ServerDiscoveryService工作流程源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-12-12
继承WebMvcConfigurationSupport后自动配置不生效及如何配置拦截器
这篇文章主要介绍了继承WebMvcConfigurationSupport后自动配置不生效及如何配置拦截器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-11-11


最新评论