La Force de réessayer spécifiques du code de statut http

Affaire à un site web spécifique, parfois, je reçois une réponse http avec le code d'état 403. Je voulais ré-exécuter la requête dans de tels cas (parce que, dans ma situation particulière, à ce serveur renvoie une 403 quand il est surchargé). J'ai essayé d'utiliser un ResponseHandler avec un StandardHttpRequestRetryHandler, mais il ne fonctionne pas de la manière que j'espère; j'ai attendu que de jeter une exception dans le ResponseHandler déclencherait la StandardHttpRequestRetryHandler, mais il ne semble pas être le cas. Comment puis-je obtenir la fonctionnalité désirée?

Voici un exemple de code qui illustre ma situation:

import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.StandardHttpRequestRetryHandler;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
public class Main {
public static void main(String[] args) throws Exception {
//a response handler that throws an exception if status is not 200
ResponseHandler<String> responseHandler = new ResponseHandler<String> () {
@Override
public String handleResponse(HttpResponse response) throws
ClientProtocolException, IOException
{
System.out.println("-> Handling response");
if (response.getStatusLine().getStatusCode() != 200){
//I expected this to trigger the retryHandler 
throw new ClientProtocolException("Status code not supported");
}
return EntityUtils.toString(response.getEntity());
}
};
StandardHttpRequestRetryHandler retryHandler = 
new StandardHttpRequestRetryHandler(5, true)
{
@Override
public boolean retryRequest(
final IOException exception,
final int executionCount,
final HttpContext context)
{
System.out.println("-> Retrying request");
return super.retryRequest(exception, executionCount, context);
}
};
//my client with my retry handler
HttpClient client = HttpClients
.custom()
.setRetryHandler(retryHandler)
.build();
//my request
HttpUriRequest request = RequestBuilder
.create("GET")
.setUri("http://httpstat.us/403")         //always returns 403
.build();
String contents = client.execute(request, responseHandler);
System.out.println(contents);
}
}
je pense que tu veux dire 503 Service Indisponible

OriginalL'auteur Cacovsky | 2014-04-03