Skip to content

Commit 0ea0715

Browse files
committed
✨ 新增 Http 配置,支持配置超时时间、代理
1 parent 24dc81d commit 0ea0715

File tree

10 files changed

+207
-65
lines changed

10 files changed

+207
-65
lines changed

src/main/java/com/xkcoding/http/HttpUtil.java

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,11 @@
1616

1717
package com.xkcoding.http;
1818

19+
import com.xkcoding.http.config.HttpConfig;
1920
import com.xkcoding.http.exception.SimpleHttpException;
21+
import com.xkcoding.http.support.AbstractHttp;
2022
import com.xkcoding.http.support.Http;
2123
import com.xkcoding.http.support.HttpHeader;
22-
import com.xkcoding.http.support.httpclient.HttpClientImpl;
23-
import com.xkcoding.http.support.hutool.HutoolImpl;
24-
import com.xkcoding.http.support.okhttp3.OkHttp3Impl;
2524
import com.xkcoding.http.util.ClassUtil;
2625
import lombok.experimental.UtilityClass;
2726

@@ -37,40 +36,58 @@
3736
*/
3837
@UtilityClass
3938
public class HttpUtil {
40-
private static Http proxy;
39+
private static AbstractHttp proxy;
4140

42-
static {
43-
Http defaultProxy = null;
41+
private void selectHttpProxy() {
42+
AbstractHttp defaultProxy = null;
4443
ClassLoader classLoader = HttpUtil.class.getClassLoader();
4544
// 基于 java 11 HttpClient
4645
if (ClassUtil.isPresent("java.net.http.HttpClient", classLoader)) {
47-
defaultProxy = new com.xkcoding.http.support.java11.HttpClientImpl();
46+
defaultProxy = getHttpProxy(com.xkcoding.http.support.java11.HttpClientImpl.class);
4847
}
4948
// 基于 okhttp3
50-
else if (ClassUtil.isPresent("okhttp3.OkHttpClient", classLoader)) {
51-
defaultProxy = new OkHttp3Impl();
49+
if (null == defaultProxy && ClassUtil.isPresent("okhttp3.OkHttpClient", classLoader)) {
50+
defaultProxy = getHttpProxy(com.xkcoding.http.support.okhttp3.OkHttp3Impl.class);
5251
}
5352
// 基于 httpclient
54-
else if (ClassUtil.isPresent("org.apache.http.impl.client.HttpClients", classLoader)) {
55-
defaultProxy = new HttpClientImpl();
53+
if (null == defaultProxy && ClassUtil.isPresent("org.apache.http.impl.client.HttpClients", classLoader)) {
54+
defaultProxy = getHttpProxy(com.xkcoding.http.support.httpclient.HttpClientImpl.class);
5655
}
5756
// 基于 hutool
58-
else if (ClassUtil.isPresent("cn.hutool.http.HttpRequest", classLoader)) {
59-
defaultProxy = new HutoolImpl();
57+
if (null == defaultProxy && ClassUtil.isPresent("cn.hutool.http.HttpRequest", classLoader)) {
58+
defaultProxy = getHttpProxy(com.xkcoding.http.support.hutool.HutoolImpl.class);
6059
}
60+
61+
if (defaultProxy == null) {
62+
throw new SimpleHttpException("Has no HttpImpl defined in environment!");
63+
}
64+
6165
proxy = defaultProxy;
6266
}
6367

64-
public void setHttp(Http http) {
68+
private static <T extends AbstractHttp> AbstractHttp getHttpProxy(Class<T> clazz) {
69+
try {
70+
return clazz.newInstance();
71+
} catch (Throwable e) {
72+
return null;
73+
}
74+
}
75+
76+
public void setHttp(AbstractHttp http) {
6577
proxy = http;
6678
}
67-
79+
6880
private void checkHttpNotNull(Http proxy) {
6981
if (null == proxy) {
70-
throw new SimpleHttpException("HTTP 实现类未指定!");
82+
selectHttpProxy();
7183
}
7284
}
7385

86+
public void setConfig(HttpConfig httpConfig) {
87+
checkHttpNotNull(proxy);
88+
proxy.setHttpConfig(httpConfig);
89+
}
90+
7491
/**
7592
* GET 请求
7693
*
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.xkcoding.http.config;
2+
3+
import com.xkcoding.http.constants.Constants;
4+
import lombok.Data;
5+
6+
import java.net.Proxy;
7+
8+
/**
9+
* <p>
10+
* Http 配置类
11+
* </p>
12+
*
13+
* @author yangkai.shen
14+
* @date Created in 2020-04-29 14:41
15+
*/
16+
@Data
17+
public class HttpConfig {
18+
/**
19+
* 超时时长,单位毫秒
20+
*/
21+
private int timeout = Constants.DEFAULT_TIMEOUT;
22+
/**
23+
* 代理配置
24+
*/
25+
private Proxy proxy;
26+
}

src/main/java/com/xkcoding/http/constants/Constants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public interface Constants {
3131
/**
3232
* 超时时长,单位毫秒
3333
*/
34-
int TIMEOUT = 3000;
34+
int DEFAULT_TIMEOUT = 3000;
3535

3636
/**
3737
* 编码格式
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.xkcoding.http.support;
2+
3+
import com.xkcoding.http.config.HttpConfig;
4+
5+
/**
6+
* <p>
7+
* HTTP 抽象类
8+
* </p>
9+
*
10+
* @author yangkai.shen
11+
* @date Created in 2020-04-29 14:45
12+
*/
13+
public abstract class AbstractHttp implements Http {
14+
protected HttpConfig httpConfig;
15+
16+
public AbstractHttp(HttpConfig httpConfig) {
17+
this.httpConfig = httpConfig;
18+
}
19+
20+
public void setHttpConfig(HttpConfig httpConfig) {
21+
this.httpConfig = httpConfig;
22+
}
23+
}

src/main/java/com/xkcoding/http/support/httpclient/HttpClientImpl.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616

1717
package com.xkcoding.http.support.httpclient;
1818

19+
import com.xkcoding.http.config.HttpConfig;
1920
import com.xkcoding.http.constants.Constants;
2021
import com.xkcoding.http.exception.SimpleHttpException;
21-
import com.xkcoding.http.support.Http;
22+
import com.xkcoding.http.support.AbstractHttp;
2223
import com.xkcoding.http.support.HttpHeader;
2324
import com.xkcoding.http.util.MapUtil;
2425
import com.xkcoding.http.util.StringUtil;
2526
import org.apache.http.Header;
27+
import org.apache.http.HttpHost;
2628
import org.apache.http.NameValuePair;
2729
import org.apache.http.client.config.RequestConfig;
2830
import org.apache.http.client.entity.UrlEncodedFormEntity;
@@ -37,6 +39,8 @@
3739
import org.apache.http.util.EntityUtils;
3840

3941
import java.io.IOException;
42+
import java.net.InetSocketAddress;
43+
import java.net.Proxy;
4044
import java.util.ArrayList;
4145
import java.util.List;
4246
import java.util.Map;
@@ -49,21 +53,35 @@
4953
* @author yangkai.shen
5054
* @date Created in 2019/12/25 09:24
5155
*/
52-
public class HttpClientImpl implements Http {
56+
public class HttpClientImpl extends AbstractHttp {
5357
private final CloseableHttpClient httpClient;
5458

5559
public HttpClientImpl() {
56-
this(HttpClients.createDefault());
60+
this(HttpClients.createDefault(), new HttpConfig());
5761
}
5862

59-
public HttpClientImpl(CloseableHttpClient httpClient) {
63+
public HttpClientImpl(HttpConfig httpConfig) {
64+
this(HttpClients.createDefault(), httpConfig);
65+
}
66+
67+
public HttpClientImpl(CloseableHttpClient httpClient, HttpConfig httpConfig) {
68+
super(httpConfig);
6069
this.httpClient = httpClient;
6170
}
6271

6372
private String exec(HttpRequestBase request) {
6473
this.addHeader(request);
6574
// 设置超时时长
66-
request.setConfig(RequestConfig.custom().setConnectTimeout(Constants.TIMEOUT).setSocketTimeout(Constants.TIMEOUT).setConnectionRequestTimeout(Constants.TIMEOUT).build());
75+
RequestConfig.Builder configBuilder = RequestConfig.custom().setConnectTimeout(httpConfig.getTimeout()).setSocketTimeout(httpConfig.getTimeout()).setConnectionRequestTimeout(httpConfig.getTimeout());
76+
// 设置代理
77+
if (null != httpConfig.getProxy()) {
78+
Proxy proxy = httpConfig.getProxy();
79+
InetSocketAddress address = (InetSocketAddress) proxy.address();
80+
HttpHost host = new HttpHost(address.getHostName(), address.getPort(), proxy.type().name().toLowerCase());
81+
configBuilder.setProxy(host);
82+
}
83+
84+
request.setConfig(configBuilder.build());
6785

6886
try (CloseableHttpResponse response = this.httpClient.execute(request)) {
6987
if (!isSuccess(response)) {
@@ -108,7 +126,6 @@ private boolean isSuccess(CloseableHttpResponse response) {
108126
* GET 请求
109127
*
110128
* @param url URL
111-
*
112129
* @return 结果
113130
*/
114131
@Override
@@ -122,7 +139,6 @@ public String get(String url) {
122139
* @param url URL
123140
* @param params 参数
124141
* @param encode 是否需要 url encode
125-
*
126142
* @return 结果
127143
*/
128144
@Override
@@ -137,7 +153,6 @@ public String get(String url, Map<String, String> params, boolean encode) {
137153
* @param params 参数
138154
* @param header 请求头
139155
* @param encode 是否需要 url encode
140-
*
141156
* @return 结果
142157
*/
143158
@Override
@@ -158,7 +173,6 @@ public String get(String url, Map<String, String> params, HttpHeader header, boo
158173
* POST 请求
159174
*
160175
* @param url URL
161-
*
162176
* @return 结果
163177
*/
164178
@Override
@@ -172,7 +186,6 @@ public String post(String url) {
172186
*
173187
* @param url URL
174188
* @param data JSON 参数
175-
*
176189
* @return 结果
177190
*/
178191
@Override
@@ -186,7 +199,6 @@ public String post(String url, String data) {
186199
* @param url URL
187200
* @param data JSON 参数
188201
* @param header 请求头
189-
*
190202
* @return 结果
191203
*/
192204
@Override
@@ -213,7 +225,6 @@ public String post(String url, String data, HttpHeader header) {
213225
* @param url URL
214226
* @param params form 参数
215227
* @param encode 是否需要 url encode
216-
*
217228
* @return 结果
218229
*/
219230
@Override
@@ -228,7 +239,6 @@ public String post(String url, Map<String, String> params, boolean encode) {
228239
* @param params form 参数
229240
* @param header 请求头
230241
* @param encode 是否需要 url encode
231-
*
232242
* @return 结果
233243
*/
234244
@Override

src/main/java/com/xkcoding/http/support/hutool/HutoolImpl.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818

1919
import cn.hutool.http.HttpRequest;
2020
import cn.hutool.http.HttpResponse;
21-
import com.xkcoding.http.constants.Constants;
21+
import com.xkcoding.http.config.HttpConfig;
2222
import com.xkcoding.http.exception.SimpleHttpException;
23-
import com.xkcoding.http.support.Http;
23+
import com.xkcoding.http.support.AbstractHttp;
2424
import com.xkcoding.http.support.HttpHeader;
2525
import com.xkcoding.http.util.MapUtil;
2626
import com.xkcoding.http.util.StringUtil;
@@ -36,9 +36,23 @@
3636
* @author yangkai.shen
3737
* @date Created in 2019/12/24 19:08
3838
*/
39-
public class HutoolImpl implements Http {
39+
public class HutoolImpl extends AbstractHttp {
40+
public HutoolImpl() {
41+
this(new HttpConfig());
42+
}
43+
44+
public HutoolImpl(HttpConfig httpConfig) {
45+
super(httpConfig);
46+
}
47+
4048
private String exec(HttpRequest request) {
41-
request = request.timeout(Constants.TIMEOUT);
49+
// 设置超时时长
50+
request = request.timeout(httpConfig.getTimeout());
51+
// 设置代理
52+
if (null != httpConfig.getProxy()) {
53+
request = request.setProxy(httpConfig.getProxy());
54+
}
55+
4256
try (HttpResponse response = request.execute()) {
4357
if (!response.isOk()) {
4458
throw new SimpleHttpException("Unexpected code " + response);
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.xkcoding.http.support.java11;
2+
3+
import com.xkcoding.http.config.HttpConfig;
4+
import com.xkcoding.http.exception.SimpleHttpException;
5+
6+
import java.io.IOException;
7+
import java.net.Proxy;
8+
import java.net.ProxySelector;
9+
import java.net.SocketAddress;
10+
import java.net.URI;
11+
import java.util.Collections;
12+
import java.util.List;
13+
14+
/**
15+
* <p>
16+
* 默认代理选择器
17+
* </p>
18+
*
19+
* @author yangkai.shen
20+
* @date Created in 2020-04-29 15:59
21+
*/
22+
public class DefaultProxySelector extends ProxySelector {
23+
private HttpConfig httpConfig;
24+
25+
public DefaultProxySelector(HttpConfig httpConfig) {
26+
this.httpConfig = httpConfig;
27+
}
28+
29+
@Override
30+
public List<Proxy> select(URI uri) {
31+
return Collections.singletonList(httpConfig.getProxy());
32+
}
33+
34+
@Override
35+
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
36+
throw new SimpleHttpException("Proxy connect failed!");
37+
}
38+
}

0 commit comments

Comments
 (0)