我在网站上使用 Apache Httpclient 进行 Ajax 调用。在某些情况下,对外部 Web 服务的请求会失败,通常是:
处理请求时捕获的 I/O 异常 (java.net.ConnectException):连接超时:连接。
在这种情况下,我通常想跳过重试请求(Httpclient 似乎自动执行的操作)。
但是,我找不到任何方法、参数等来跳过重试。
任何人?
谢谢 Geert-Jan
我在网站上使用 Apache Httpclient 进行 Ajax 调用。在某些情况下,对外部 Web 服务的请求会失败,通常是:
处理请求时捕获的 I/O 异常 (java.net.ConnectException):连接超时:连接。
在这种情况下,我通常想跳过重试请求(Httpclient 似乎自动执行的操作)。
但是,我找不到任何方法、参数等来跳过重试。
任何人?
谢谢 Geert-Jan
从 httpclient 4.3 开始使用 HttpClientBuilder
HttpClientBuilder.create().disableAutomaticRetries().build();
client.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false));
这样就可以了。
好的。文档中有问题。API和方法也发生了变化。因此,如果您想使用DefaultHttpRequestRetryHandler
,这里有一些方法,
DefaultHttpClient httpClient = new DefaultHttpClient();
DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(0, false);
httpClient.setHttpRequestRetryHandler(retryHandler);
或者
HttpClient httpClient = new DefaultHttpClient();
DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(0, false);
((AbstractHttpClient)httpClient).setHttpRequestRetryHandler(retryHandler);
在第一个中,我们使用具体的 DefaultHttpClient(它是 AbstractHttpClient 的子类,因此有 setHttpRequestRetryHandler() 方法。)
在第二个中,我们正在对 HttpClient 接口进行编程(遗憾的是,它没有公开该方法,这很奇怪!!嗯),所以我们必须做那个讨厌的演员。
HttpClient 教程中有描述。
client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());
有关更多信息,请参阅教程,例如,如果请求有副作用(即不是幂等的),这可能是有害的。
不需要强制转换为 AbstractHttpClient。另一种方法是使用AutoRetryHttpClient策略,并将DefaultServiceUnavailableRetryStrategy设置为 0 用于重试参数。更好的方法是扩展 AbstractHttpClient 或实现 HttpClient 以公开所需的方法。