2017-09-13 3 views
0

Ich lerne, wie man Retrofit2 benutzt, aber ich bin in Schwierigkeiten.Ausnahmebehandlung mit Retrofit2

Ist das eine Möglichkeit, das Response Objekt auf retrofit2.Retrofit zu fangen und eine Ausnahme auszulösen, wenn der HTTP-Antwortcode außerhalb des Bereichs 2xx liegt?

ich einige JAX-RS Rest Dienstleistungen bin der Umsetzung, wo meine Ruhe Methoden einen anderen Rest APIs aufrufen, Informationen zu sammeln, und ich möchte alle HTTP-Fehler auf der JAX-RS Seite zu handhaben:

public class HelloRest { 

    @GET("/ping") 
    public String ping() throws IOException { 
     HelloService client = HelloServiceBuilder.getInstance(); 
     String response = client.sayHello().execute().body(); 
     LOGGER.info(response); 
    } 

    @GET ("echo/{msg}") 
    public String echo(@PathParam("msg") String msg) throws IOException { 
     HelloService client = HelloServiceBuilder.getInstance(); 
     String response = client.echo(msg).execute().body(); 
     LOGGER.info(response); 
     return response; 
    } 
} 

Zuerst habe ich habe festgestellt, dass die execute() Methode IOException wirft, so dass ich es zu den Restmethoden Signaturen hinzufügen musste. Das ist in Ordnung, ich kann es mit JAX-RS richtig handhaben.

Aber was ist der beste Weg, um Fehler zu behandeln, die HTTP-Antworten betrifft, wo der Antwortcode außerhalb des Bereichs 2xx ist?

Ich will nicht wiederholt Code-Block schreiben, den HTTP-Response-Code jederzeit zu überprüfen, wenn ich Retrofit2 wie folgt verwenden:

Response<String> response = client.ping().execute(); 
int responseCode = response.code(); 
if (responseCode < 200 && responseCode > 299) { 
    throws AnyException("..."); 
} 

String serverResponse = response.body(); 
... 

Kann ich etwas zu dem Retrofit.Builder() Codeblock hinzufügen, um diese Situation auf einem zu handhaben allgemeiner Weg irgendwie?

public final class HelloServiceBuilder { 

    private static final String SERVICE_URL = "..."; 

    private HelloServiceBuilder() { 
     // do nothing 
    } 

    public static HelloService getInstance() { 
     Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(SERVICE_URL) 
      .addConverterFactory(ScalarsConverterFactory.create()) 
      .HOW-TO-CHECK-RESPONSES-HERE? 
      .build(); 

     return retrofit.create(HelloService.class); 
    } 
} 

Antwort

0

Ich werde meine Rest-Client-Klasse mit JAX-RS erstellen. Es ist Teil von Java, ich muss keine zusätzliche Abhängigkeit zu meinem Pom hinzufügen, funktioniert wie ein Charm und ich muss nur eine Klasse anstelle von 2 oder mehr erstellen:

public final class MyRestClient { 
    private static Client client = ClientBuilder.newClient(); 

    public static String hello() { 
     String serviceUrl = "http://..../"; 
     String path ="hello"; 

     Response response = client 
       .target(serviceUrl) 
       .path(path) 
       .request(ExtendedMediaType.APPLICATION_UTF8) 
       .get(); 

     if (response.getStatus() == Response.Status.OK.getStatusCode()) { 
      return response.getEntity(String.class); 
     } 

     throw new WebApplicationException(response); 
    } 
}