基于webflux构建到http请求工具类 持续更新中

构建ApplicationConfig


import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import javax.net.ssl.SSLException;
import java.util.TimeZone;

@Configuration
@ComponentScan(basePackages = {"cn.hutool.extra.spring"})
public class ApplicationConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
    }

    @Bean
    public SslContext sslContext() throws SSLException {
        return SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();
    }
}

创建工具类


import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import io.netty.channel.ChannelOption;
import io.netty.handler.ssl.SslContext;
import org.springframework.http.HttpHeaders;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.ExchangeStrategies;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.transport.ProxyProvider;

import java.time.Duration;
import java.util.List;
import java.util.Map;

public class WebClientUtil {
    private HttpClient httpClient;
    private ExchangeStrategies exchangeStrategies;
    private HttpHeaders defaultHeaders;

    public WebClientUtil() {
        httpClient = HttpClient.create();
        defaultHeaders = new HttpHeaders();
    }

    public static WebClientUtil create() {
        return new WebClientUtil();
    }

    public WebClientUtil contentType(String contentType) {
        defaultHeaders.set(HttpHeaders.CONTENT_TYPE, contentType);
        return this;
    }

    public WebClientUtil setConnectionTimeout(int connectTimeout) {
        httpClient = httpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectTimeout);
        return this;
    }

    public WebClientUtil setReadTimeout(int readTimeout) {
        httpClient = httpClient.responseTimeout(Duration.ofMillis(readTimeout));
        return this;
    }

    public WebClientUtil setMaxInMemorySize(int bufferSize) {
        exchangeStrategies = ExchangeStrategies.builder().codecs(clientCodecConfigurer -> clientCodecConfigurer.defaultCodecs().maxInMemorySize(bufferSize))
                .build();
        return this;
    }

    public WebClientUtil setHttpProxy(String host, int port) {
        httpClient = httpClient.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP).host(host).port(port));
        return this;
    }

    public WebClientUtil noProxy(){
        httpClient = httpClient.noProxy();
        return this;
    }

    public WebClientUtil trustSSL(){
        SslContext sslContext = SpringUtil.getBean("sslContext");
        httpClient=httpClient.secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));
        return this;
    }

    public WebClientUtil auth(String content){
        defaultHeaders.set(HttpHeaders.AUTHORIZATION,content);
        return this;
    }

    public WebClientUtil bearerAuth(String token){
        return auth("Bearer " + token);
    }

    public WebClientUtil header(String name,String value,boolean isOverride){
        if(StrUtil.isNotBlank(name) && StrUtil.isNotBlank(value)){
            List<String> values = defaultHeaders.get(name);
            if(!isOverride && !CollectionUtil.isEmpty(values)){
                defaultHeaders.add(name,value);
            }else {
                defaultHeaders.set(name,value);
            }
        }
        return this;
    }

    public WebClientUtil addHeaders(Map<String,String> headers, boolean isOverride){
        headers.keySet().forEach(name ->{
            String value = headers.get(name);
            header(name,value,isOverride);
        });
        return this;
    }

    public WebClient build(String baseUrl){
        return WebClient.builder()
                .defaultHeaders(httpHeaders -> httpHeaders.addAll(defaultHeaders))
                .clientConnector(new ReactorClientHttpConnector(httpClient))
                .exchangeStrategies(exchangeStrategies)
                .baseUrl(baseUrl)
                .build();
    }
}