基于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();
}
}