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
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser un custom
ServiceUnavailableRetryStrategy
OriginalL'auteur oleg
Vous pouvez le faire en vérifiant manuellement le code d'état, quelque chose comme ceci:
Vous auriez besoin d'ajouter certaines choses comme une nouvelle tentative de nombre prédéfini de fois avant de jeter un final d'exception et la capture de certains checked exceptions près (comme la InterruptedException jetés par
Thread.sleep()
), mais, fondamentalement, le code affiche l'idée principale.Je vous remercie pour votre réponse. En fait, comme il est un RetryHandler, je m'attends à une sorte d'intégration entre les RetryHandler et la ResponseHandler, en évitant le genre de solution que vous avez proposée. Mais il semble qu'il n'est pas possible à l'aide de HttpComponents enfichable choses. Je vais continuer d'essayer, si.
S'il vous plaît, voir oleg réponse, c'est exactement ce que je cherchais.
OriginalL'auteur morgano