我正在发出一个 http 请求。我在一个网络操作经常失败的平台 (android) 上,因为网络连接可能无法立即可用。因此,我想在完全失败之前尝试相同的连接 N 次。正在考虑这样的事情:
DefaultHttpClient mHttp = ...;
public HttpResponse runHttpRequest(HttpRequestBase httpRequest)
throws IOException
{
IOException last = null;
for (int attempt = 0; attempt < 3; attempt++) {
try {
HttpResponse response = mHttpClient.execute(httpRequest);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
return response;
}
} catch (IOException e) {
httpRequest.abort();
last = e;
}
}
throw last;
}
我最担心的是连接处于某种在后续重试时无效的状态。换句话说,我是否需要完全重新创建“httpRequest”,是否应该避免在 catch block 中调用 httpRequest.abort(),而只在最终失败时调用它?
谢谢
最佳答案
文档没有提到会发生这样的事情,尽管您必须尝试一下。不过,更重要的是,您应该在代码中考虑一些事项...
- 您可能应该公开重试次数,允许调用者指定此值。
- 只有在抛出异常时才应重试;你目前重试,除非你得到一个 200。但是,例如,如果你得到一个 404......这并不意味着你的请求失败,因为网络没有失败......相反,你取得了成功的回合 -访问服务器,但服务器根本没有请求的资源...所以在这种情况下重试真的没有意义。
- 按原样,您可以抑制各种不同类型的异常。记录 List 中发生的所有异常并返回某种包含响应(如果所有尝试都失败则可能为 null)以及所有异常列表的结果对象可能是有意义的。否则,您会从已发生的异常集中抛出一些任意异常,可能会掩盖失败。
- 现在您只是一遍又一遍地敲定相同的请求...如果出现拥塞,您只是在添加。而且,如果您的 IP 地址因 Activity 过多而被禁止,您可能会添加到该地址中……任何类型的重试逻辑都应具有退避行为,其中重试之间有一定的等待时间,并且该间隔随着时间的推移而增加每次失败。
关于java - 重试 http 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3929748/