在httpclient 4.3中,如果您尊重所有弃用,则必须使用HttpClient
(文档here)构建和配置HttpClientBuilder
。方法是明确的,它们似乎易于使用,HttpClient
's interface很清楚。但也许有点太多了。
就我自己而言,我必须继承Spring HttpComponentsHttpInvokerRequestExecutor
(文档here)。因此,我可以轻松获得HttpClient
,但我对此对象的所有了解都是它实现了接口。
由于客户端已经构建,并且我对其实现一无所知,因此我无法访问AbstractHttpClient
' s setHttpRequestRetryHandler
或addRequestInterceptor
等方法(尽管是,我知道,他们已被弃用了。)
那么,更新这个HttpClient
的设置最简洁的方法是什么(重试处理程序和请求拦截器是我目前最关注的那些)?我应该......
AbstractHttpClient
,希望我能一直接受这个实施?HttpClient
,得到类似下面的示例?我可以补充一点,Spring的构造函数(至少在3.2.4中)也使用了httpclient 4.3中不推荐使用的方法。使用这种策略会不会有任何副作用?自定义构造函数示例:
public CustomHttpInvokerRequestExecutor() {
super(); // will create an HttpClient
// Now overwrite the client the super constructor created
setHttpClient(HttpClientBuilder.custom(). ... .build());
}
答案 0 :(得分:3)
做一些我还没有提出的建议吗?
我的建议是重新思考整个方法。不应该在运行时删除/添加协议拦截器,而应该使用HttpContext
实例来更新请求执行上下文并将配置传递给协议拦截器
http://hc.apache.org/httpcomponents-core-4.4.x/tutorial/html/fundamentals.html#d5e306 http://hc.apache.org/httpcomponents-client-4.3.x/tutorial/html/fundamentals.html#d5e223
CloseableHttpClient client = HttpClientBuilder.create()
.addInterceptorFirst(new HttpRequestInterceptor() {
@Override
public void process(
final HttpRequest request,
final HttpContext context) throws HttpException, IOException {
boolean b = (Boolean) context.getAttribute("my-config");
if (b) {
// do something useful
}
}
})
.build();
HttpClientContext context = HttpClientContext.create();
context.setAttribute("my-config", Boolean.TRUE);
CloseableHttpResponse response1 = client.execute(new HttpGet("/"), context);
response1.close();
context.setAttribute("my-config", Boolean.FALSE);
CloseableHttpResponse response2 = client.execute(new HttpGet("/"), context);
response2.close();