HttpClientManger

package com.gateway.http.client;

import com.fasterxml.jackson.core.type.TypeReference;
import com.apollo.common.http.HttpMethod;
import com.apollo.gateway.common.HttpConstant;
import com.apollo.gateway.util.JsonUtil;
import okhttp3.*;
import okhttp3.internal.Util;
import okhttp3.logging.HttpLoggingInterceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
*
* @author muzhi
* @date 2022-11-21 19:17:28
*/
public class HttpClientManager {
private static final Logger log = LoggerFactory.getLogger(HttpClientManager.class);
private static final Map<Long, OkHttpClient> map = new HashMap<>();
private static final Long TIMEOUT = 5000L;
private <T> T request(HttpMethod httpMethod, OkHttpClient httpClient, final String url, Map<String, String> header, final Object param,
final TypeReference<T> typeReference) throws IOException {
final Request.Builder builder = new Request.Builder();
//add header
if(header != null && !header.isEmpty()){
header.forEach((k, v) -> {
if(v != null){
builder.addHeader(k, v);
}
});
} switch (httpMethod){
case POST:
if(param != null){
if(param instanceof byte[]){
builder.post(new ByteRequestBody((byte[]) param));
} else {
String content = JsonUtil.toJson(param);
RequestBody requestBody = RequestBody.create(HttpConstant.JSON_MEDIA_TYPE, content);
builder.post(requestBody);
}
} else {
builder.post(RequestBody.create(HttpConstant.JSON_MEDIA_TYPE, "{}"));
}
builder.url(url);
break;
case GET:
StringBuilder str = new StringBuilder(url);
if(param != null && param instanceof Map){
if(!url.contains("?")){
str.append("?");
}
Map body = (Map) param;
if(body != null && !body.isEmpty()){
StringJoiner joiner = new StringJoiner("", "&", "");
body.forEach((k, v) -> {
joiner.add(k + "=" + v);
});
str.append("&").append(joiner.toString());
}
}
builder.url(str.toString()).get();
break;
default:
throw new RuntimeException("request method not supported");
} Response execute = httpClient.newCall(builder.build()).execute();
String response = execute.body().string();
if(typeReference == null){
return (T) response;
}
return JsonUtil.readValue(response, typeReference);
} private <T> T request(HttpMethod httpMethod, final String accessCode, final String url, final Object param,
final TypeReference<T> typeReference) throws IOException {
OkHttpClient httpClient = map.computeIfAbsent(TIMEOUT, k -> buildHttpClient());
Map<String, String> header = new HashMap<>();
return request(httpMethod, httpClient, url, header, param, typeReference);
} // public <T> T post(final String accessCode, final String url, final Object param,
// final TypeReference<T> typeReference, Long timeout) throws IOException {
// return request(HttpMethod.POST, accessCode, url, param, typeReference, timeout);
// } public <T> T post(final String accessCode, final String url, final Object param,
final TypeReference<T> typeReference) throws IOException {
return request(HttpMethod.POST, accessCode, url, param, typeReference);
} private OkHttpClient buildHttpClient() {
try {
OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
// add timeout
okHttpBuilder
.readTimeout(60_000, TimeUnit.MILLISECONDS)
.connectTimeout(60_000, TimeUnit.MILLISECONDS)
.callTimeout(60_000, TimeUnit.MILLISECONDS)
.connectionPool(new ConnectionPool(500, 5 * 60, TimeUnit.SECONDS)); // Install the all-trusting trust manager
//okHttpBuilder.addInterceptor(new RetryInterceptor(httpClientParam.getMaxRetry(), httpClientParam.getRetryInterval()));
configNoSSL(okHttpBuilder);
configDispatcher(okHttpBuilder);
configLogBody(okHttpBuilder, true);
return okHttpBuilder.build();
} catch (Exception e) {
log.error("buildHttpClient error", e);
}
return null;
} private void configDispatcher(final OkHttpClient.Builder okHttpBuilder) {
ThreadPoolExecutor executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
new SynchronousQueue<>(),
Util.threadFactory("lambada-OkHttp-Dispatcher", false)
);
Dispatcher dispatcher = new Dispatcher(executorService);
dispatcher.setMaxRequests(200);
dispatcher.setMaxRequestsPerHost(200);
okHttpBuilder.dispatcher(dispatcher);
} private static void configLogBody(OkHttpClient.Builder okHttpBuilder, boolean ignoreLargeContent) {
HttpLogger logger = new HttpLogger();
logger.setIgnoreLargeContent(ignoreLargeContent);
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor(logger);
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpBuilder.addNetworkInterceptor(logInterceptor);
} private static void configNoSSL(OkHttpClient.Builder okHttpBuilder) throws KeyManagementException, NoSuchAlgorithmException {
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
okHttpBuilder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
okHttpBuilder.hostnameVerifier((hostname, session) -> true);
} private static final TrustManager[] trustAllCerts =
new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] chain, String authType) {
} @Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain, String authType) {
} @Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[] {};
}
}
};
}

HttpClientManager的更多相关文章

  1. Using HttpClient properly to avoid CLOSE_WAIT TCP connections

    Apache的HttpComponent组件,用的人不在少数.但是能用好的人,却微乎其微,为什么?很简单,TCP里面的细节实现不是每个人都能捕获到的(细节是魔鬼),像并发请求控制&资源释放,N ...

  2. Web API的接口访问安全性

    使用签名获取Token 首先我们自定义appkey.appSecret.可用GUID随机生成,AppSecret要不定期更换.然后放到配置文件中. Appkey=1AF62C68-B970-46E7- ...

  3. httpclient httpclient连接回收

    httpclient连接释放 httpClient必须releaseConnection,但不是abort.因为releaseconnection是归还连接到到连接池,而abort是直接抛弃这个连接, ...

随机推荐

  1. 2022年最新数据库经典面试题及答案汇总(含PostgreSQL、Oracle、MySQL)

    随着企业数字化需求的增加,数据库行业发展日益壮大,企业对DBA岗位的需求也处于逐步增加中.我们梳理了墨天轮平台上2022年最新的一批数据库经典面试题,主要包含PostgreSQL.MySQL和Orac ...

  2. iOS程序内语言切换使用小结

    随着时代的发展,应用程序相继出现了不同语言的版本方案,中文,英文,法文,韩文等等:想在应用程序中实现语言的自由切换,需要配置多个语言的文件,根据用户的动态选择获取不同语言文件下的语言文件,从而显示到界 ...

  3. 本地图片上传服务器返回在线地址接口 - file - input -修改头像-带预览功能- 然后使用cropperjs 进行裁剪

    说明:上传的图片是 file 类型 ,核心就是获取图片文件(file类型的) : 实现一:使用 vant2 的图片加载组件 ,选择文件后会触发afterRead方法 ,参数 file 就是文件列表fi ...

  4. 小程序按住选中 text

    <text selectable>按住选中可以赋值的</text>

  5. 40. diff 的新旧节点数组如何比较

    根据唯一标识符key值,把新旧的节点比较,不同就更新到新节点,相同就复用就节点,然后生成新的 Vnode :

  6. python模拟发送、消费kafka消息

    参考文章: https://zhuanlan.zhihu.com/p/279784873 生产者代码: import traceback from kafka import KafkaProducer ...

  7. Java新特性-stream流

    Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达 ...

  8. NDT论文翻译

    The Normal Distributions Transform: A New Approach to Laser Scan Matching 正态分布变换:激光扫描匹配的新方法 摘要:匹配 2D ...

  9. 【小记】Docker容器间SSH公钥自动交换实现免密登录的一次尝试

    咋想到这茬了 最近开始忙毕设的事儿了,想部署个伪分布式的Spark + Hadoop集群来进行测试.思来考去,最终咱把目光放在了Docker上. 盘了两天,发现这玩意意外的有趣,镜像构建好后开箱即用, ...

  10. 电脑端 itunes 备份保存路径修改方法

    默认在c盘,重做系统就会丢失. 1.先删除C:\Users\你的用户名\AppData\Roaming\Apple Computer里的 MobileSync文件夹(首次安装iTunes没有,要先运行 ...