Browse Source

改为okhttp试试 看看是否还超时

dev
jianjun 4 years ago
parent
commit
8c394f2d4d
  1. 46
      epmet-auth/src/test/java/com/epmet/ThirdPlatformTest.java
  2. 17
      epmet-commons/epmet-commons-thirdplat/src/main/java/com/epmet/commons/thirdplat/apiservice/jcet/JcetApiService.java
  3. 4
      epmet-commons/epmet-commons-tools/pom.xml
  4. 33
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/HttpLogInterceptor.java
  5. 432
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/OkHttpUtil.java
  6. 64
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/SSLSocketClient.java
  7. 7
      epmet-module/epmet-ext/epmet-ext-server/pom.xml
  8. 7
      epmet-module/epmet-third/epmet-third-server/pom.xml
  9. 11
      pom.xml

46
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;
/**
* descredisson测试类
*/
@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;
}
}
}

17
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<String> result = null;
try {
result = HttpClientManager.getInstance().sendPost(
//方式1
/*result = HttpClientManager.getInstance().sendPost(
url,
domain.startsWith("https://"),
JSON.toJSONString(ssoTicket),
headers);
headers);*/
//方式2
Map<String,Object> 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<String>().ok(body.string());
}
} catch (Exception e) {
logger.warn("请求酒城e通第三方平台异常", e);
}

4
epmet-commons/epmet-commons-tools/pom.xml

@ -154,6 +154,10 @@
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
</dependencies>
<build>

33
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;
}
}

432
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<String, Object> 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<String, String> 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<String, String> 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<String, Object> bodyParams, Map<String, Object> 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<String, Object> bodyParams, Map<String, Object> 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<String, Object> bodyParams, Map<String, Object> 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<String, Object> bodyParams, Map<String, Object> 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<String, String> 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<String, String> bodyParams) {
RequestBody body = null;
okhttp3.FormBody.Builder formEncodingBuilder = new okhttp3.FormBody.Builder();
if (bodyParams != null) {
Iterator<String> 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<String, Object> para)
throws URISyntaxException, MalformedURLException {
URIBuilder builder = new URIBuilder(url);
Set<String> 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<String, Object> 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();
}
}
}

64
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;
}
}

7
epmet-module/epmet-ext/epmet-ext-server/pom.xml

@ -123,13 +123,6 @@
<!--<version>5.1.1</version>-->
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>

7
epmet-module/epmet-third/epmet-third-server/pom.xml

@ -93,13 +93,6 @@
<!--<version>5.1.1</version>-->
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>

11
pom.xml

@ -92,6 +92,17 @@
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
<version>1.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.3.70</version>
</dependency>
</dependencies>
</dependencyManagement>

Loading…
Cancel
Save