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配置使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
解决weblogic部署springboot项目步骤及可能会出现的问题
这篇文章主要介绍了解决weblogic部署springboot项目步骤及可能会出现的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07详解Spring Boot实战之Restful API的构建
这篇文章主要介绍了详解Spring Boot实战之Restful API的构建,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-01-01Java中的日期时间类实例详解(Date、Calendar、DateFormat)
在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理,这篇文章主要介绍了Java中的日期时间类详解(Date、Calendar、DateFormat),需要的朋友可以参考下2023-11-11
最新评论