Kraft wiederholen, auf bestimmte http-status-code

Umgang mit einer bestimmten website, manchmal bekomme ich eine http-Antwort mit dem status-code 403. Ich wollte für die erneute Ausführung der Anfrage in solchen Fällen (da, in meiner spezifischen situation dieser server wirft eine 403, wenn es tatsächlich überlastet). Ich habe versucht, eine ResponseHandler zusammen mit einem StandardHttpRequestRetryHandler, aber es hat nicht funktioniert, wie ich gehofft; ich erwartete, dass das werfen einer Ausnahme in der ResponseHandler auslösen würde, die den StandardHttpRequestRetryHandler, aber es scheint nicht der Fall zu sein. Wie Erreiche ich die gewünschte Funktionalität?

Hier ist ein Beispielcode, der veranschaulicht, meine 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);
  }


}
  • ich denke du meinst 503 - Service Unavailable
InformationsquelleAutor Cacovsky | 2014-04-03
Schreibe einen Kommentar