From 8c394f2d4dbec8e05627119a5e731e554fefd353 Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 16 Apr 2021 18:29:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E4=B8=BAokhttp=E8=AF=95=E8=AF=95=20?= =?UTF-8?q?=E7=9C=8B=E7=9C=8B=E6=98=AF=E5=90=A6=E8=BF=98=E8=B6=85=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/ThirdPlatformTest.java | 46 ++ .../apiservice/jcet/JcetApiService.java | 17 +- epmet-commons/epmet-commons-tools/pom.xml | 4 + .../tools/utils/net/HttpLogInterceptor.java | 33 ++ .../commons/tools/utils/net/OkHttpUtil.java | 432 ++++++++++++++++++ .../tools/utils/net/SSLSocketClient.java | 64 +++ .../epmet-ext/epmet-ext-server/pom.xml | 7 - .../epmet-third/epmet-third-server/pom.xml | 7 - pom.xml | 11 + 9 files changed, 605 insertions(+), 16 deletions(-) create mode 100644 epmet-auth/src/test/java/com/epmet/ThirdPlatformTest.java create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/HttpLogInterceptor.java create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/OkHttpUtil.java create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/SSLSocketClient.java diff --git a/epmet-auth/src/test/java/com/epmet/ThirdPlatformTest.java b/epmet-auth/src/test/java/com/epmet/ThirdPlatformTest.java new file mode 100644 index 0000000000..cd249df861 --- /dev/null +++ b/epmet-auth/src/test/java/com/epmet/ThirdPlatformTest.java @@ -0,0 +1,46 @@ +package com.epmet; + +import com.alibaba.fastjson.JSON; +import com.epmet.commons.thirdplat.apiservice.jcet.JcetApiService; +import com.epmet.commons.thirdplat.bean.ThirdPlatUserInfo; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * desc:redisson测试类 + */ +@Slf4j +@RunWith(value = SpringRunner.class) +@SpringBootTest(classes = {AuthApplication.class}) +public class ThirdPlatformTest { + + @Autowired + private JcetApiService jcetApiService; + + @Test + public void t() { + String ssoTicket = "ssoTicket-5kc8FY7Re2iv7Kfq74G9EWCN7QybBjxB"; + for (int i = 0; i < 50; i++) { + getUserINfoByTicket(ssoTicket); + } + + } + + private void getUserINfoByTicket(String ssoTicket) { + try { + ThirdPlatUserInfo cUserInfoByTicket = jcetApiService.getCUserInfoByTicket(ssoTicket); + log.info("result:{}", JSON.toJSONString(cUserInfoByTicket)); + } catch (Exception e) { + log.info("失败:{}", e.getMessage()); + if (e.getMessage().contains("Read timed out")) + log.info("失败了"); + //break; + } + + } + +} diff --git a/epmet-commons/epmet-commons-thirdplat/src/main/java/com/epmet/commons/thirdplat/apiservice/jcet/JcetApiService.java b/epmet-commons/epmet-commons-thirdplat/src/main/java/com/epmet/commons/thirdplat/apiservice/jcet/JcetApiService.java index 70862f8a0f..ca63619d4d 100644 --- a/epmet-commons/epmet-commons-thirdplat/src/main/java/com/epmet/commons/thirdplat/apiservice/jcet/JcetApiService.java +++ b/epmet-commons/epmet-commons-thirdplat/src/main/java/com/epmet/commons/thirdplat/apiservice/jcet/JcetApiService.java @@ -12,6 +12,8 @@ import com.epmet.commons.thirdplat.properties.JcetThirdplatProps; import com.epmet.commons.thirdplat.properties.ThirdplatProps; import com.epmet.commons.tools.utils.HttpClientManager; import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.utils.net.OkHttpUtil; +import okhttp3.ResponseBody; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,11 +56,22 @@ public class JcetApiService extends AbstractApiService { Result result = null; try { - result = HttpClientManager.getInstance().sendPost( + //方式1 + /*result = HttpClientManager.getInstance().sendPost( url, domain.startsWith("https://"), JSON.toJSONString(ssoTicket), - headers); + headers);*/ + + + //方式2 + Map param = new HashMap<>(); + param.put("ssoTicket",ticket); + headers.put("Content-Type", "application/json;charset=utf-8"); + ResponseBody body = OkHttpUtil.getInstance().postData(url, param, headers).body(); + if (body != null){ + result = new Result().ok(body.string()); + } } catch (Exception e) { logger.warn("请求酒城e通第三方平台异常", e); } diff --git a/epmet-commons/epmet-commons-tools/pom.xml b/epmet-commons/epmet-commons-tools/pom.xml index 10b76c6f11..0f8bd545fc 100644 --- a/epmet-commons/epmet-commons-tools/pom.xml +++ b/epmet-commons/epmet-commons-tools/pom.xml @@ -154,6 +154,10 @@ com.aliyun alibaba-dingtalk-service-sdk + + com.squareup.okhttp3 + okhttp + diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/HttpLogInterceptor.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/HttpLogInterceptor.java new file mode 100644 index 0000000000..dc7194b6d8 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/HttpLogInterceptor.java @@ -0,0 +1,33 @@ +package com.epmet.commons.tools.utils.net; + +import lombok.extern.slf4j.Slf4j; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +/** + * desc: + * + * @author: LiuJanJun + * @date: 2021/4/16 5:02 下午 + * @version: 1.0 + */ +@Slf4j +class HttpLogInterceptor implements Interceptor { + @Override public Response intercept(Interceptor.Chain chain) throws IOException { + Request request = chain.request(); + long t1 = System.nanoTime(); + log.info(String.format("Sending request %s on %s%n%s", + request.url(), chain.connection(), request.headers())); + + Response response = chain.proceed(request); + + long t2 = System.nanoTime(); + log.info(String.format("Received response for %s in %.1fms%n%s", + response.request().url(), (t2 - t1) / 1e6d, response.headers())); + + return response; + } +} diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/OkHttpUtil.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/OkHttpUtil.java new file mode 100644 index 0000000000..27fd4c05ef --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/OkHttpUtil.java @@ -0,0 +1,432 @@ +package com.epmet.commons.tools.utils.net; + + +import okhttp3.*; +import org.apache.http.client.utils.URIBuilder; +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.net.MalformedURLException; +import java.net.URISyntaxException; +import java.security.SecureRandom; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.*; +import java.util.concurrent.TimeUnit; + + +public class OkHttpUtil { + + private static final Logger logger = LoggerFactory.getLogger(OkHttpUtil.class); + + public final static int READ_TIMEOUT = 100; + public final static int CONNECT_TIMEOUT = 60; + public final static int WRITE_TIMEOUT = 60; + public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); + + public static final String CONTENT_TYPE = "Content-Type"; + + private static final byte[] LOCKER = new byte[0]; + private static OkHttpUtil mInstance; + private OkHttpClient mOkHttpClient; + + + private OkHttpUtil() { + //todo 由于是静态工具类,只会创建client一次,如果以后需要不同请求不同超时时间,不能这样使用 + okhttp3.OkHttpClient.Builder clientBuilder = new okhttp3.OkHttpClient.Builder(); + //设置读取超市时间 + clientBuilder.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS); + //设置超时连接时间 + clientBuilder.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS); + //设置写入超时时间 + clientBuilder.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS); + //支持HTTPS请求,跳过证书验证 + clientBuilder.sslSocketFactory(SSLSocketClient.getSSLSocketFactory(), SSLSocketClient.getX509TrustManager()) + .hostnameVerifier(SSLSocketClient.getHostnameVerifier()); + //clientBuilder.sslSocketFactory(createSSLSocketFactory()); + /*clientBuilder.hostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + });*/ + + //添加拦截器 + clientBuilder.addInterceptor(new HttpLogInterceptor()); + mOkHttpClient = clientBuilder.build(); + } + + /** + * 单例模式获取NetUtils + * + * @return + */ + public static OkHttpUtil getInstance() { + if (mInstance == null) { + synchronized (LOCKER) { + if (mInstance == null) { + mInstance = new OkHttpUtil(); + } + } + } + return mInstance; + } + + + /** + * get请求,同步方式,获取网络数据,是在主线程中执行的,需要新起线程,将其放到子线程中执行 + * + * @param url + * @return + */ + public Response getData(String url) { + return getData(url, null); + } + + + /** + * get请求,同步方式,获取网络数据,是在主线程中执行的,需要新起线程,将其放到子线程中执行 + * + * @param url + * @return + */ + public Response getData(String url, Map headerMap) { + //1 构造Request + Request.Builder builder = new Request.Builder().get().url(url); + //Request request = builder.get().url(url).build(); + //builder = builder.get().url(url); + /*if (headerMap != null && headerMap.isEmpty()) { + for (Map.Entry headerEntry : headerMap.entrySet()) { + builder.addHeader(headerEntry.getKey(), headerEntry.getValue()); + } + }*/ + addHeaders(headerMap,builder); + Request request = builder.build(); + + + //2 将Request封装为Call + Call call = mOkHttpClient.newCall(request); + //3 执行Call,得到response + Response response = null; + try { + response = call.execute(); + } catch (IOException e) { + e.printStackTrace(); + } + return response; + } + + /** + * post form表单 请求,同步方式,提交数据,是在主线程中执行的,需要新起线程,将其放到子线程中执行 + * + * @param url + * @param bodyParams + * @return + */ + /*public Response postFormData(String url, Map bodyParams) { + //1构造RequestBody + RequestBody body = setRequestBody(bodyParams); + //2 构造Request + Request.Builder requestBuilder = new Request.Builder(); + Request request = requestBuilder.post(body).addHeader(CONTENT_TYPE, HttpContentTypeEnum.FORM.contentTypeValue).url(url).build(); + //3 将Request封装为Call + Call call = mOkHttpClient.newCall(request); + //4 执行Call,得到response + Response response = null; + try { + response = call.execute(); + } catch (IOException e) { + e.printStackTrace(); + } + return response; + }*/ + + /** + * post方式 + * + * @param url 请求url + * @param bodyParams requestbody + * @param headerMap 请求头信息 + * @return + * @throws IOException + */ + public Response postData(String url, Map bodyParams, Map headerMap) throws Exception { + //1构造RequestBody + RequestBody body = setRequestBody(bodyParams, headerMap); + //2 构造Request + Request.Builder requestBuilder = new Request.Builder().post(body).url(url); + //requestBuilder = requestBuilder.post(body).url(url); + addHeaders(headerMap, requestBuilder); + Request request = requestBuilder.build(); + //Request request = requestBuilder.post(body).addHeader(CONTENT_TYPE, HttpContentTypeEnum.JSON.contentTypeValue).url(url).build(); + //3 将Request封装为Call + Call call = mOkHttpClient.newCall(request); + //4 执行Call,得到response + Response response = null; + try { + response = call.execute(); + } catch (IOException e) { + e.printStackTrace(); + } + return response; + } + + + /** + * put请求方式 + * + * @param url + * @param bodyParams + * @return + */ + public Response putData(String url, Map bodyParams, Map headerMap) throws Exception { + //1构造RequestBody + RequestBody body = setRequestBody(bodyParams, headerMap); + //2 构造Request + Request.Builder requestBuilder = new Request.Builder().put(body).url(url); + addHeaders(headerMap, requestBuilder); + Request request = requestBuilder.build(); + //3 将Request封装为Call + Call call = mOkHttpClient.newCall(request); + //4 执行Call,得到response + Response response = null; + try { + response = call.execute(); + } catch (IOException e) { + e.printStackTrace(); + } + return response; + + } + + + /** + * @param url + * @param bodyParams + * @return + */ + public Response delData(String url, Map bodyParams, Map headerMap) throws Exception { + //1构造RequestBody + RequestBody body = setRequestBody(bodyParams, headerMap); + //2 构造Request + Request.Builder requestBuilder = new Request.Builder().delete(body).url(url); + addHeaders(headerMap, requestBuilder); + Request request = requestBuilder.build(); + //3 将Request封装为Call + Call call = mOkHttpClient.newCall(request); + //4 执行Call,得到response + Response response = null; + try { + response = call.execute(); + } catch (IOException e) { + e.printStackTrace(); + } + return response; + } + + + /** + * post的请求参数,构造RequestBody + * + * @param bodyParams + * @return + */ + private RequestBody setRequestBody(Map bodyParams, Map headerMap) throws Exception { + //判断请求头中是否存在 content-type字段 + if (headerMap == null || !headerMap.containsKey(CONTENT_TYPE)) { + throw new Exception("请求头信息配置中无 Content-Type配置,请先配置"); + } + + Object contentType = headerMap.get(CONTENT_TYPE); + String contentTypeStr = contentType != null?contentType.toString():null; + if ("application/x-www-form-urlencoded".equals(contentTypeStr)) { + //表单提交 就是key-value 都是字符串型 + //转换 + Map strBodyParamMap = new HashMap<>(); + if (bodyParams != null && !bodyParams.isEmpty()) { + bodyParams.forEach((key, value) -> { + if (value != null) { + strBodyParamMap.put(key, (String) value); + } + }); + } + return buildRequestBodyByMap(strBodyParamMap); + } else { + //json + return buildRequestBodyByJson(com.alibaba.fastjson.JSON.toJSONString(bodyParams)); + } + + } + + /** + * 表单方式提交构建 + * + * @param bodyParams + * @return + */ + private RequestBody buildRequestBodyByMap(Map bodyParams) { + RequestBody body = null; + okhttp3.FormBody.Builder formEncodingBuilder = new okhttp3.FormBody.Builder(); + if (bodyParams != null) { + Iterator iterator = bodyParams.keySet().iterator(); + String key = ""; + while (iterator.hasNext()) { + key = iterator.next().toString(); + formEncodingBuilder.add(key, bodyParams.get(key)); + logger.info(" 请求参数:{},请求值:{} ", key, bodyParams.get(key)); + } + } + body = formEncodingBuilder.build(); + return body; + } + + /** + * json方式提交构建 + * + * @param jsonStr + * @return + */ + private RequestBody buildRequestBodyByJson(String jsonStr) { + return RequestBody.create(JSON, jsonStr); + } + + + /** + * 生成安全套接字工厂,用于https请求的证书跳过 + * + * @return + */ + public SSLSocketFactory createSSLSocketFactory() { + SSLSocketFactory ssfFactory = null; + try { + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom()); + ssfFactory = sc.getSocketFactory(); + } catch (Exception e) { + } + return ssfFactory; + } + + + + /** + * 针对json post处理 + * + * @param url + * @param json + * @return + * @throws IOException + */ + public String postJson(String url, String json) throws IOException { + RequestBody body = RequestBody.create(JSON, json); + Request request = new Request.Builder() + .url(url) + .post(body) + .build(); + Response response = mOkHttpClient.newCall(request).execute(); + if (response.isSuccessful()) { + return response.body().string(); + } else { + throw new IOException("Unexpected code " + response); + } + } + + public void postJsonAsyn(String url, String json, final MyNetCall myNetCall) throws IOException { + RequestBody body = RequestBody.create(JSON, json); + //2 构造Request + Request.Builder requestBuilder = new Request.Builder(); + Request request = requestBuilder.post(body).url(url).build(); + //3 将Request封装为Call + Call call = mOkHttpClient.newCall(request); + //4 执行Call + call.enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + myNetCall.failed(call, e); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + myNetCall.success(call, response); + + } + }); + } + + /** + * 自定义网络回调接口 + */ + public interface MyNetCall { + void success(Call call, Response response) throws IOException; + + void failed(Call call, IOException e); + } + + /** + * 构建http get请求,将参数拼接到url后面 + * + * @param url + * @param para + * @return + * @throws URISyntaxException + * @throws MalformedURLException + */ + public static String buildHttpGet(String url, Map para) + throws URISyntaxException, MalformedURLException { + URIBuilder builder = new URIBuilder(url); + Set set = para.keySet(); + for (String key : set) { + builder.setParameter(key, String.valueOf(para.get(key))); + } + return builder.build().toURL().toString(); + } + + + /** + * 添加header信息 + * + * @param headerMap + * @param builder + * @return + */ + private static Request.Builder addHeaders(Map headerMap, Request.Builder builder) { + if (headerMap != null && !headerMap.isEmpty()) { + headerMap.forEach((key, value) -> builder.addHeader(key, value == null? null:value.toString())); + } + return builder; + } + + /** + * 用于信任所有证书 + */ + class TrustAllCerts implements X509TrustManager { + @Override + public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + } + + @Override + public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + } + public static void main(String[] args) { + try { + Response data = OkHttpUtil.getInstance().getData("http://218.88.215.93:10011/open-api/app/token?appKey=Y6FKNwWxaeSapJT8&appSecret=e87695b9010dec760f6787a90e32921c"); + System.out.println(Objects.requireNonNull(data.body()).string()); + System.out.println(Optional.ofNullable(null).get()); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/SSLSocketClient.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/SSLSocketClient.java new file mode 100644 index 0000000000..1ba1e1cf26 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/SSLSocketClient.java @@ -0,0 +1,64 @@ +package com.epmet.commons.tools.utils.net; + + +import javax.net.ssl.*; +import java.security.KeyStore; +import java.security.SecureRandom; +import java.security.cert.X509Certificate; +import java.util.Arrays; + +public class SSLSocketClient { + + //获取这个SSLSocketFactory + public static SSLSocketFactory getSSLSocketFactory() { + try { + SSLContext sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, getTrustManager(), new SecureRandom()); + return sslContext.getSocketFactory(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + //获取TrustManager + private static TrustManager[] getTrustManager() { + return new TrustManager[]{ + new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; + } + } + }; + } + + //获取HostnameVerifier + public static HostnameVerifier getHostnameVerifier() { + return (s, sslSession) -> true; + } + + public static X509TrustManager getX509TrustManager() { + X509TrustManager trustManager = null; + try { + TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory.init((KeyStore) null); + TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); + if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { + throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers)); + } + trustManager = (X509TrustManager) trustManagers[0]; + } catch (Exception e) { + e.printStackTrace(); + } + + return trustManager; + } +} diff --git a/epmet-module/epmet-ext/epmet-ext-server/pom.xml b/epmet-module/epmet-ext/epmet-ext-server/pom.xml index 9eda7325be..e60ffed6f6 100644 --- a/epmet-module/epmet-ext/epmet-ext-server/pom.xml +++ b/epmet-module/epmet-ext/epmet-ext-server/pom.xml @@ -123,13 +123,6 @@ - - - com.squareup.okhttp3 - okhttp - 4.0.0 - - org.springframework.boot spring-boot-starter-test diff --git a/epmet-module/epmet-third/epmet-third-server/pom.xml b/epmet-module/epmet-third/epmet-third-server/pom.xml index fdd764c6e0..1fe1597ec8 100644 --- a/epmet-module/epmet-third/epmet-third-server/pom.xml +++ b/epmet-module/epmet-third/epmet-third-server/pom.xml @@ -93,13 +93,6 @@ - - - com.squareup.okhttp3 - okhttp - 4.0.0 - - org.springframework.boot spring-boot-starter-test diff --git a/pom.xml b/pom.xml index 9420c9ff24..9b61cacf07 100644 --- a/pom.xml +++ b/pom.xml @@ -92,6 +92,17 @@ alibaba-dingtalk-service-sdk 1.0.1 + + + com.squareup.okhttp3 + okhttp + 4.9.0 + + + org.jetbrains.kotlin + kotlin-stdlib + 1.3.70 +