Skip to content

Commit 1c1044e

Browse files
authored
🎨 DefaultApacheHttpClientBuilder 允许添加自定义拦截器
1 parent 6fc1b7a commit 1c1044e

File tree

2 files changed

+73
-2
lines changed

2 files changed

+73
-2
lines changed

weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/DefaultApacheHttpClientBuilder.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import lombok.extern.slf4j.Slf4j;
55
import org.apache.commons.lang3.StringUtils;
66
import org.apache.http.HttpHost;
7+
import org.apache.http.HttpRequestInterceptor;
8+
import org.apache.http.HttpResponseInterceptor;
79
import org.apache.http.auth.AuthScope;
810
import org.apache.http.auth.UsernamePasswordCredentials;
911
import org.apache.http.client.CredentialsProvider;
@@ -34,6 +36,8 @@
3436
import java.security.NoSuchAlgorithmException;
3537
import java.security.cert.CertificateException;
3638
import java.security.cert.X509Certificate;
39+
import java.util.ArrayList;
40+
import java.util.List;
3741
import java.util.concurrent.TimeUnit;
3842
import java.util.concurrent.atomic.AtomicBoolean;
3943

@@ -93,6 +97,16 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
9397
*/
9498
private String userAgent;
9599

100+
/**
101+
* 自定义请求拦截器
102+
*/
103+
private List<HttpRequestInterceptor> requestInterceptors = new ArrayList<>();
104+
105+
/**
106+
* 自定义响应拦截器
107+
*/
108+
private List<HttpResponseInterceptor> responseInterceptors = new ArrayList<>();
109+
96110
/**
97111
* 自定义重试策略
98112
*/
@@ -229,6 +243,12 @@ private synchronized void prepare() {
229243
httpClientBuilder.setUserAgent(this.userAgent);
230244
}
231245

246+
//添加自定义的请求拦截器
247+
requestInterceptors.forEach(httpClientBuilder::addInterceptorFirst);
248+
249+
//添加自定义的响应拦截器
250+
responseInterceptors.forEach(httpClientBuilder::addInterceptorLast);
251+
232252
this.closeableHttpClient = httpClientBuilder.build();
233253
prepared.set(true);
234254
}

weixin-java-common/src/test/java/me/chanjar/weixin/common/util/http/apache/DefaultApacheHttpClientBuilderTest.java

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
package me.chanjar.weixin.common.util.http.apache;
22

3+
import org.apache.http.HttpRequestInterceptor;
4+
import org.apache.http.HttpResponseInterceptor;
35
import org.apache.http.client.methods.CloseableHttpResponse;
46
import org.apache.http.client.methods.HttpGet;
7+
import org.apache.http.client.methods.HttpUriRequest;
8+
import org.apache.http.client.protocol.HttpClientContext;
59
import org.apache.http.impl.client.CloseableHttpClient;
10+
import org.apache.http.protocol.BasicHttpContext;
11+
import org.apache.http.protocol.HttpContext;
12+
import org.apache.http.protocol.HttpCoreContext;
613
import org.testng.Assert;
714
import org.testng.annotations.Test;
815

916
import java.io.IOException;
1017
import java.util.ArrayList;
18+
import java.util.Arrays;
1119
import java.util.List;
20+
import java.util.stream.Collectors;
21+
import java.util.stream.Stream;
1222

1323
public class DefaultApacheHttpClientBuilderTest {
1424
@Test
@@ -24,7 +34,7 @@ public void testBuild() throws Exception {
2434
}
2535
for (TestThread testThread : threadList) {
2636
testThread.join();
27-
Assert.assertNotEquals(-1,testThread.getRespState(),"请求响应code不应为-1");
37+
Assert.assertNotEquals(-1, testThread.getRespState(), "请求响应code不应为-1");
2838
}
2939

3040
for (int i = 1; i < threadList.size(); i++) {
@@ -38,6 +48,47 @@ public void testBuild() throws Exception {
3848
}
3949
}
4050

51+
@Test
52+
void testHttpClientWithInterceptor() throws Exception {
53+
DefaultApacheHttpClientBuilder builder = DefaultApacheHttpClientBuilder.get();
54+
55+
56+
List<String> interceptorOrder = new ArrayList<>();
57+
58+
HttpRequestInterceptor requestInterceptor1 = (request, context) -> {
59+
context.setAttribute("interceptor_called", "requestInterceptor1");
60+
interceptorOrder.add("requestInterceptor1");
61+
};
62+
63+
HttpRequestInterceptor requestInterceptor2 = (request, context) -> {
64+
interceptorOrder.add("requestInterceptor2");
65+
};
66+
67+
HttpResponseInterceptor responseInterceptor1 = (response, context) -> {
68+
interceptorOrder.add("responseInterceptor1");
69+
};
70+
71+
HttpResponseInterceptor responseInterceptor2 = (response, context) -> {
72+
interceptorOrder.add("responseInterceptor2");
73+
};
74+
75+
builder.setRequestInterceptors(Stream.of(requestInterceptor1, requestInterceptor2).collect(Collectors.toList()));
76+
builder.setResponseInterceptors(Stream.of(responseInterceptor1, responseInterceptor2).collect(Collectors.toList()));
77+
78+
try (CloseableHttpClient client = builder.build()) {
79+
HttpUriRequest request = new HttpGet("http://localhost:8080");
80+
HttpContext context = HttpClientContext.create();
81+
try (CloseableHttpResponse resp = client.execute(request, context)) {
82+
Assert.assertEquals("requestInterceptor1", context.getAttribute("interceptor_called"), "成功调用 requestInterceptor1 并向 content 中写入了数据");
83+
84+
// 测试拦截器执行顺序
85+
Assert.assertEquals("requestInterceptor1", interceptorOrder.get(0));
86+
Assert.assertEquals("requestInterceptor2", interceptorOrder.get(1));
87+
Assert.assertEquals("responseInterceptor1", interceptorOrder.get(2));
88+
Assert.assertEquals("responseInterceptor2", interceptorOrder.get(3));
89+
}
90+
}
91+
}
4192

4293
public static class TestThread extends Thread {
4394
private CloseableHttpClient client;
@@ -47,7 +98,7 @@ public static class TestThread extends Thread {
4798
public void run() {
4899
client = DefaultApacheHttpClientBuilder.get().build();
49100
HttpGet httpGet = new HttpGet("http://www.sina.com.cn/");
50-
try (CloseableHttpResponse resp = client.execute(httpGet)){
101+
try (CloseableHttpResponse resp = client.execute(httpGet)) {
51102
respState = resp.getStatusLine().getStatusCode();
52103
} catch (IOException ignored) {
53104
}

0 commit comments

Comments
 (0)