Skip to content

Commit d6e1ad4

Browse files
dylanleungbinarywang
authored andcommitted
#293 重构OkHttp的实现代码,同时修复JSApi的bug
* update travis settings * feat(okhttp): 修改okhttp底层调用方法 直接用OkHttpClient代替connect.使客户端单一化.Okhttp 自动管理连接池优化 * feat(log,jsApi): 添加log debug 标记明确下调用底层效果,修复jsAPI Lock 为null 问题 添加log debug 标记明确下调用底层效果,修复jsAPI Lock 为null 问题 #293
1 parent bceabfb commit d6e1ad4

17 files changed

+159
-280
lines changed

weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java

+13-20
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66
import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor;
77
import me.chanjar.weixin.common.util.http.RequestHttp;
88
import okhttp3.*;
9+
import okio.BufferedSink;
10+
import okio.Okio;
911
import org.apache.commons.lang3.StringUtils;
12+
import org.slf4j.Logger;
13+
import org.slf4j.LoggerFactory;
1014

1115
import java.io.ByteArrayInputStream;
1216
import java.io.File;
@@ -18,7 +22,8 @@
1822
/**
1923
* Created by ecoolper on 2017/5/5.
2024
*/
21-
public class OkHttpMediaDownloadRequestExecutor extends MediaDownloadRequestExecutor<ConnectionPool, OkHttpProxyInfo> {
25+
public class OkHttpMediaDownloadRequestExecutor extends MediaDownloadRequestExecutor<OkHttpClient, OkHttpProxyInfo> {
26+
private final Logger logger = LoggerFactory.getLogger(this.getClass());
2227

2328

2429
public OkHttpMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) {
@@ -27,30 +32,16 @@ public OkHttpMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFi
2732

2833
@Override
2934
public File execute(String uri, String queryParam) throws WxErrorException, IOException {
35+
logger.debug("OkHttpMediaDownloadRequestExecutor is running");
3036
if (queryParam != null) {
3137
if (uri.indexOf('?') == -1) {
3238
uri += '?';
3339
}
3440
uri += uri.endsWith("?") ? queryParam : '&' + queryParam;
3541
}
3642

37-
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder().connectionPool(requestHttp.getRequestHttpClient());
38-
//设置代理
39-
if (requestHttp.getRequestHttpProxy() != null) {
40-
clientBuilder.proxy(requestHttp.getRequestHttpProxy().getProxy());
41-
}
42-
//设置授权
43-
clientBuilder.authenticator(new Authenticator() {
44-
@Override
45-
public Request authenticate(Route route, Response response) throws IOException {
46-
String credential = Credentials.basic(requestHttp.getRequestHttpProxy().getProxyUsername(), requestHttp.getRequestHttpProxy().getProxyPassword());
47-
return response.request().newBuilder()
48-
.header("Authorization", credential)
49-
.build();
50-
}
51-
});
5243
//得到httpClient
53-
OkHttpClient client = clientBuilder.build();
44+
OkHttpClient client = requestHttp.getRequestHttpClient();
5445

5546
Request request = new Request.Builder().url(uri).get().build();
5647

@@ -66,10 +57,12 @@ public Request authenticate(Route route, Response response) throws IOException {
6657
if (StringUtils.isBlank(fileName)) {
6758
return null;
6859
}
69-
70-
InputStream inputStream = new ByteArrayInputStream(response.body().bytes());
7160
String[] nameAndExt = fileName.split("\\.");
72-
return FileUtils.createTmpFile(inputStream, nameAndExt[0], nameAndExt[1], super.tmpDirFile);
61+
File file = File.createTempFile(nameAndExt[0], nameAndExt[1], super.tmpDirFile);
62+
try (BufferedSink sink = Okio.buffer(Okio.sink(file))) {
63+
sink.writeAll(response.body().source());
64+
}
65+
return file;
7366
}
7467

7568
private String getFileName(Response response) throws WxErrorException {

weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java

+6-17
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,27 @@
66
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
77
import me.chanjar.weixin.common.util.http.RequestHttp;
88
import okhttp3.*;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
911

1012
import java.io.File;
1113
import java.io.IOException;
1214

1315
/**
1416
* Created by ecoolper on 2017/5/5.
1517
*/
16-
public class OkHttpMediaUploadRequestExecutor extends MediaUploadRequestExecutor<ConnectionPool, OkHttpProxyInfo> {
18+
public class OkHttpMediaUploadRequestExecutor extends MediaUploadRequestExecutor<OkHttpClient, OkHttpProxyInfo> {
19+
private final Logger logger = LoggerFactory.getLogger(this.getClass());
1720

1821
public OkHttpMediaUploadRequestExecutor(RequestHttp requestHttp) {
1922
super(requestHttp);
2023
}
2124

2225
@Override
2326
public WxMediaUploadResult execute(String uri, File file) throws WxErrorException, IOException {
24-
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder().connectionPool(requestHttp.getRequestHttpClient());
25-
//设置代理
26-
if (requestHttp.getRequestHttpProxy() != null) {
27-
clientBuilder.proxy(requestHttp.getRequestHttpProxy().getProxy());
28-
}
29-
//设置授权
30-
clientBuilder.authenticator(new Authenticator() {
31-
@Override
32-
public Request authenticate(Route route, Response response) throws IOException {
33-
String credential = Credentials.basic(requestHttp.getRequestHttpProxy().getProxyUsername(), requestHttp.getRequestHttpProxy().getProxyPassword());
34-
return response.request().newBuilder()
35-
.header("Authorization", credential)
36-
.build();
37-
}
38-
});
27+
logger.debug("OkHttpMediaUploadRequestExecutor is running");
3928
//得到httpClient
40-
OkHttpClient client = clientBuilder.build();
29+
OkHttpClient client = requestHttp.getRequestHttpClient();
4130

4231
RequestBody body = new MultipartBody.Builder()
4332
.setType(MediaType.parse("multipart/form-data"))

weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java

+6-19
Original file line numberDiff line numberDiff line change
@@ -5,47 +5,34 @@
55
import me.chanjar.weixin.common.util.http.RequestHttp;
66
import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
77
import okhttp3.*;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
810

911
import java.io.IOException;
1012

1113
/**
1214
* Created by ecoolper on 2017/5/4.
1315
*/
14-
public class OkHttpSimpleGetRequestExecutor extends SimpleGetRequestExecutor<ConnectionPool, OkHttpProxyInfo> {
16+
public class OkHttpSimpleGetRequestExecutor extends SimpleGetRequestExecutor<OkHttpClient, OkHttpProxyInfo> {
17+
private final Logger logger = LoggerFactory.getLogger(this.getClass());
1518

1619
public OkHttpSimpleGetRequestExecutor(RequestHttp requestHttp) {
1720
super(requestHttp);
1821
}
1922

2023
@Override
2124
public String execute(String uri, String queryParam) throws WxErrorException, IOException {
25+
logger.debug("OkHttpSimpleGetRequestExecutor is running");
2226
if (queryParam != null) {
2327
if (uri.indexOf('?') == -1) {
2428
uri += '?';
2529
}
2630
uri += uri.endsWith("?") ? queryParam : '&' + queryParam;
2731
}
2832

29-
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder().connectionPool(requestHttp.getRequestHttpClient());
30-
//设置代理
31-
if (requestHttp.getRequestHttpProxy() != null) {
32-
clientBuilder.proxy(requestHttp.getRequestHttpProxy().getProxy());
33-
}
34-
//设置授权
35-
clientBuilder.authenticator(new Authenticator() {
36-
@Override
37-
public Request authenticate(Route route, Response response) throws IOException {
38-
String credential = Credentials.basic(requestHttp.getRequestHttpProxy().getProxyUsername(), requestHttp.getRequestHttpProxy().getProxyPassword());
39-
return response.request().newBuilder()
40-
.header("Authorization", credential)
41-
.build();
42-
}
43-
});
4433
//得到httpClient
45-
OkHttpClient client = clientBuilder.build();
46-
34+
OkHttpClient client = requestHttp.getRequestHttpClient();
4735
Request request = new Request.Builder().url(uri).build();
48-
4936
Response response = client.newCall(request).execute();
5037
String responseContent = response.body().string();
5138
WxError error = WxError.fromJson(responseContent);

weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimplePostRequestExecutor.java

+6-21
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,26 @@
55
import me.chanjar.weixin.common.util.http.RequestHttp;
66
import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
77
import okhttp3.*;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
810

911
import java.io.IOException;
1012

1113
/**
1214
* Created by ecoolper on 2017/5/4.
1315
*/
14-
public class OkHttpSimplePostRequestExecutor extends SimplePostRequestExecutor<ConnectionPool, OkHttpProxyInfo> {
16+
public class OkHttpSimplePostRequestExecutor extends SimplePostRequestExecutor<OkHttpClient, OkHttpProxyInfo> {
17+
private final Logger logger = LoggerFactory.getLogger(this.getClass());
1518

1619
public OkHttpSimplePostRequestExecutor(RequestHttp requestHttp) {
1720
super(requestHttp);
1821
}
1922

2023
@Override
2124
public String execute(String uri, String postEntity) throws WxErrorException, IOException {
22-
ConnectionPool pool = requestHttp.getRequestHttpClient();
23-
final OkHttpProxyInfo proxyInfo = requestHttp.getRequestHttpProxy();
24-
25-
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder().connectionPool(pool);
26-
//设置代理
27-
if (proxyInfo != null) {
28-
clientBuilder.proxy(proxyInfo.getProxy());
29-
}
30-
//设置授权
31-
clientBuilder.authenticator(new Authenticator() {
32-
@Override
33-
public Request authenticate(Route route, Response response) throws IOException {
34-
String credential = Credentials.basic(proxyInfo.getProxyUsername(), proxyInfo.getProxyPassword());
35-
return response.request().newBuilder()
36-
.header("Authorization", credential)
37-
.build();
38-
}
39-
});
25+
logger.debug("OkHttpSimplePostRequestExecutor running");
4026
//得到httpClient
41-
OkHttpClient client = clientBuilder.build();
42-
27+
OkHttpClient client = requestHttp.getRequestHttpClient();
4328

4429
MediaType mediaType = MediaType.parse("text/plain; charset=utf-8");
4530
RequestBody body = RequestBody.create(mediaType, postEntity);

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceOkHttpImpl.java

+25-25
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,20 @@
77
import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo;
88
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
99
import okhttp3.*;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
1012

1113
import java.io.IOException;
1214

13-
public class WxCpServiceOkHttpImpl extends AbstractWxCpServiceImpl<ConnectionPool, OkHttpProxyInfo> {
14-
protected ConnectionPool httpClient;
15+
public class WxCpServiceOkHttpImpl extends AbstractWxCpServiceImpl<OkHttpClient, OkHttpProxyInfo> {
16+
private final Logger logger = LoggerFactory.getLogger(this.getClass());
17+
18+
protected OkHttpClient httpClient;
1519
protected OkHttpProxyInfo httpProxy;
1620

1721

1822
@Override
19-
public ConnectionPool getRequestHttpClient() {
23+
public OkHttpClient getRequestHttpClient() {
2024
return httpClient;
2125
}
2226

@@ -32,6 +36,7 @@ public HttpType getRequestType() {
3236

3337
@Override
3438
public String getAccessToken(boolean forceRefresh) throws WxErrorException {
39+
logger.debug("WxCpServiceOkHttpImpl is running");
3540
if (forceRefresh) {
3641
this.configStorage.expireAccessToken();
3742
}
@@ -41,24 +46,8 @@ public String getAccessToken(boolean forceRefresh) throws WxErrorException {
4146
String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?"
4247
+ "&corpid=" + this.configStorage.getCorpId()
4348
+ "&corpsecret=" + this.configStorage.getCorpSecret();
44-
45-
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder().connectionPool(httpClient);
46-
//设置代理
47-
if (httpProxy != null) {
48-
clientBuilder.proxy(getRequestHttpProxy().getProxy());
49-
}
50-
//设置授权
51-
clientBuilder.authenticator(new Authenticator() {
52-
@Override
53-
public Request authenticate(Route route, Response response) throws IOException {
54-
String credential = Credentials.basic(httpProxy.getProxyUsername(), httpProxy.getProxyPassword());
55-
return response.request().newBuilder()
56-
.header("Authorization", credential)
57-
.build();
58-
}
59-
});
6049
//得到httpClient
61-
OkHttpClient client = clientBuilder.build();
50+
OkHttpClient client = getRequestHttpClient();
6251
//请求的request
6352
Request request = new Request.Builder().url(url).get().build();
6453
Response response = null;
@@ -88,13 +77,24 @@ public Request authenticate(Route route, Response response) throws IOException {
8877

8978
@Override
9079
public void initHttp() {
91-
WxCpConfigStorage configStorage = this.configStorage;
80+
logger.debug("WxCpServiceOkHttpImpl initHttp");
81+
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
82+
//设置代理
83+
if (httpProxy != null) {
84+
clientBuilder.proxy(getRequestHttpProxy().getProxy());
9285

93-
if (configStorage.getHttpProxyHost() != null && configStorage.getHttpProxyPort() > 0) {
94-
httpProxy = new OkHttpProxyInfo(OkHttpProxyInfo.ProxyType.SOCKS5, configStorage.getHttpProxyHost(), configStorage.getHttpProxyPort(), configStorage.getHttpProxyUsername(), configStorage.getHttpProxyPassword());
86+
//设置授权
87+
clientBuilder.authenticator(new Authenticator() {
88+
@Override
89+
public Request authenticate(Route route, Response response) throws IOException {
90+
String credential = Credentials.basic(httpProxy.getProxyUsername(), httpProxy.getProxyPassword());
91+
return response.request().newBuilder()
92+
.header("Authorization", credential)
93+
.build();
94+
}
95+
});
9596
}
96-
97-
httpClient = new ConnectionPool();
97+
httpClient = clientBuilder.build();
9898
}
9999

100100
@Override

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/AbstractWxMpServiceImpl.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,9 @@ public String getJsapiTicket() throws WxErrorException {
6666

6767
@Override
6868
public String getJsapiTicket(boolean forceRefresh) throws WxErrorException {
69-
Lock lock = this.getWxMpConfigStorage().getJsapiTicketLock();
69+
Lock lock = this.getWxMpConfigStorage().getAccessTokenLock();
7070
try {
7171
lock.lock();
72-
7372
if (forceRefresh) {
7473
this.getWxMpConfigStorage().expireJsapiTicket();
7574
}

0 commit comments

Comments
 (0)