2016-04-01 4 views
8

Ich verwende die neueste Version (ab sofort 2.0.0-beta4) von Retrofit. Wenn 200 OK-Code vom Server empfangen wird, funktioniert alles einwandfrei. Aber ich will auch nicht mit OK-Antworten behandeln, wie Code 401. Also muß ich den Fehler-Response-Code erhalten, genau herauszufinden, welche Maßnahmen entsprechende Daten zu tun und angezeigt werden:Retrofit 2: responseBodyConverter konvertiert in Null-Objekt

@Override 
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { 
    if (response != null && !response.isSuccess() && response.errorBody() != null) { 
     Converter<ResponseBody, APIError> errorConverter = retrofit.responseBodyConverter(APIError.class, new Annotation[0]); 
     try { 
      APIError error = errorConverter.convert(response.errorBody()); 
      Toast.makeText(getContext(), "code = " + error.getCode() + ", status = " + error.getStatus(), Toast.LENGTH_SHORT).show(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } else if (null != response) { 
     if (response.isSuccess()) { 
      LoginResponse loginResponse = response.body(); 
      Toast.makeText(getContext(), "Successful login: " + loginResponse.getId(), Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

APIError.java

public class APIError { 
    String name; 
    int status; 
    String message; 
    int statusCode; 
    String code; 
    String stack; 

    public String getName() { 
     return name; 
    } 

    public int getStatus() { 
     return status; 
    } 

    public String getCode() { 
     return code; 
    } 
} 

Servers Fehlerreaktion

{ 
    "error": { 
    "name": "Error", 
    "status": 401, 
    "message": "login failed", 
    "statusCode": 401, 
    "code": "LOGIN_FAILED", 
    "stack": "Error: login failed" 
    } 
} 

Aber errorConverter.convert() gibt ein Objekt mit Nullwerten zurück. Ich habe similar posts geschaut, aber es hat nicht geholfen.

Was ist falsch an dem Code?

Antwort

2

die Antwort in futurestud.io Blog-Kommentare gefunden:

Changed die APIError.java dazu:

public class APIError { 

    Error error; 

    public Error getError() { 
     return error; 
    } 

    public static class Error { 

     String name; 
     int status; 
     String message; 
     int statusCode; 
     String code; 
     String stack; 

     public String getName() { 
      return name; 
     } 

     public int getStatus() { 
      return status; 
     } 

     public String getCode() { 
      return code; 
     } 

    } 
} 
+1

__futurestud.io__ bietet beste ** ** Retrofit-Tutorial –