java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > spring webClient配置使用

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

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

您可能感兴趣的文章:
阅读全文