2016-05-25 6 views
1

Ich habe Basisklasse für meine Antworten. Diese Klasse wird aufgerufen, wenn ein Problem auftritt (z. B. ein Authentifizierungsproblem).Retrofit2, wie Antwort auf Basisklasse konvertieren?

public class DefaultResponse 
{ 
    private transient Integer status; 
    private String   property; 
    private String   message; 
    private String   developerMessage; 
    protected String   code; 

    public void setResponse(final Response response) 
    { 
     if (this.status != null) 
     { 
      return; 
     } 

     if (response != null) 
     { 
      try 
      { 
       final Object obj = response.body(); 
       if (obj != null && obj instanceof DefaultResponse) 
       { 
        this.status = response.code(); 
        this.message = ((DefaultResponse) obj).message; 
        this.developerMessage = ((DefaultResponse) obj).developerMessage; 
        this.property = ((DefaultResponse) obj).property; 
        this.code = ((DefaultResponse) obj).code; 
       } 
      } 
      catch (final Exception ignored) 
      { 

      } 
     } 
    } 

... 
} 

Der Rest der Antworten erweitern diese Klasse.

public class FeatureResponse extends DefaultResponse 
{ 
    // Implementation 
} 

Dies ist die Methode, die ich bin mit der API, um Funktionen zu erhalten, rufen.

public void getFeatures(final Location location) 
    { 
     Call<FeatureResponse> call = mService.getPassengerFeatures(location); 
     call.enqueue(new Callback<FeatureResponse>() 
     { 
      @Override 
      public void onResponse(Call<FeatureResponse> call, Response<FeatureResponse> response) 
      { 
       Logger.debug("Test", "Instance of response: " + response.getClass()); 

       FeatureResponse featureResponse = new FeatureResponse(); 

       if (response.isSuccessful()) 
       { 
        //... 
       } 

       featureResponse.setResponse(response); 
       EventBus.post(featureResponse); 
      } 

      @Override 
      public void onFailure(Call<FeatureResponse> call, Throwable t) 
      { 
       Logger.error(TAG, "getPassengerFeatures.onFailure(), msg: " + t.getMessage()); 

       FeatureResponse featureResponse = new FeatureResponse(); 
       featureResponse.setFailure(t); 
       EventBus.post(featureResponse); 
      } 
     }); 
    } 

Als ich die Anfrage senden, das ist meine Server-Antwort:

{"status":403,"code":4030,"property":"","message":"Unauthorized access","developerMessage":"Unauthorized access"} 

Daher wird onResponse genannt, neues Objekt der FeatureResponse erstellt wird und featureResponse.setResponse(response); wird aufgerufen. Wie Sie im obigen Code sehen, versuche ich seinen HTTP-Statuscode zu erhalten. Allerdings ist das Problem if (obj != null && obj instanceof DefaultResponse) ist immer false als response ist Instanz der Klasse Retrofit2.Response.

Ist es möglich, Response in DefaultResponse zu konvertieren?

Antwort

0

Wenn ich Störung erhalte wie 401, ist mit 400 auf diese Weise mit Gson:

if (response.code() == 400) 
{ 
    Gson gson = new GsonBuilder().create(); 
    MyPojoError myPojoError=new MyPojoError(); 
    try { 
     myPojoError= gson.fromJson(response.errorBody().string(),MyPojoError .class); 
     } catch (IOException e) { // handle failure to read error } 

} 

Sie auch Anmerkungen benötigen, wenn Reaktion auf Pojo mit Gson Umwandlung:

public class MyPojoError { 

@SerializedName("error") 
@Expose 
private String error; 
@SerializedName("error_description") 
@Expose 
private String errorDescription; 

/** 
* 
* @return 
* The error 
*/ 
public String getError() { 
    return error; 
} 

/** 
* 
* @param error 
* The error 
*/ 
public void setError(String error) { 
    this.error = error; 
} 

/** 
* 
* @return 
* The errorDescription 
*/ 
public String getErrorDescription() { 
    return errorDescription; 
} 

/** 
* 
* @param errorDescription 
* The error_description 
*/ 
public void setErrorDescription(String errorDescription) { 
    this.errorDescription = errorDescription; 
} 

} 

Einfügen Ihr Beispiel Json Antwort auf Website, wählen Sie Quellentyp JSON, Anmerkung: Gson : Json Schema to Pojo

In Ihrem build.gradle: compile 'com.google.code.gson:gson:2.6.2'

+1

ehrfürchtige bro, sehr hilfreich. Mein anderes Problem war 'status', das auf Transient gesetzt wurde (von der vorherigen Version). Ich habe das geändert und die Serverantwort jetzt analysiert. Vielen Dank. – Hesam

+0

Sie sind willkommen, froh, Ihr Problem zu beheben. Haben Sie einen guten Tag :) –

Verwandte Themen