如何在httpclient 4.3+中更新HttpClient的设置?

时间:2014-12-19 10:44:10

标签: java spring httpclient apache-httpclient-4.x

在httpclient 4.3中,如果您尊重所有弃用,则必须使用HttpClient(文档here)构建和配置HttpClientBuilder。方法是明确的,它们似乎易于使用,HttpClient's interface很清楚。但也许有点太多了。

就我自己而言,我必须继承Spring HttpComponentsHttpInvokerRequestExecutor(文档here)。因此,我可以轻松获得HttpClient,但我对此对象的所有了解都是它实现了接口。

由于客户端已经构建,并且我对其实现一无所知,因此我无法访问AbstractHttpClient' s setHttpRequestRetryHandleraddRequestInterceptor等方法(尽管是,我知道,他们已被弃用了。)

那么,更新这个HttpClient的设置最简洁的方法是什么(重试处理程序和请求拦截器是我目前最关注的那些)?我应该......

  • ...野蛮地把我的客户送到AbstractHttpClient,希望我能一直接受这个实施?
  • ...在我的HttpInvokerRequestExecutor构造函数中创建一个新的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());
}

1 个答案:

答案 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();