2016-05-25 3 views
1

У меня есть базовый класс для моих ответов. Этот класс вызывается при возникновении проблемы (например, проблема аутентификации).Retrofit2, как преобразовать ответ в базовый класс?

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) 
      { 

      } 
     } 
    } 

... 
} 

Остальные ответы распространяются на этот класс.

public class FeatureResponse extends DefaultResponse 
{ 
    // Implementation 
} 

Это метод, который я использую для вызова API, чтобы получить функции.

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); 
      } 
     }); 
    } 

Когда я отправить запрос, это мой ответ сервера:

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

Поэтому onResponse вызывается, новый объект FeatureResponse получает создан и featureResponse.setResponse(response); вызывается. Как вы видите в приведенном выше коде, я пытаюсь получить его код статуса HTTP. Однако проблема if (obj != null && obj instanceof DefaultResponse) всегда false как response является экземпляром класса retrofit2.Response.

Можно ли преобразовать Response в DefaultResponse?

ответ

0

Когда я получаю сообщение об ошибке, таких как 401, 400 я использую этот путь с 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 } 

} 

Кроме того, необходимо аннотаций при преобразовании ответа в Pojo с Gson:

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; 
} 

} 

Вставить ваш пример Json ответ на сайт, выберите тип источника JSON, аннотация: Gson : Json Schema to Pojo

В вашем build.gradle: compile 'com.google.code.gson:gson:2.6.2'

+1

удивительным братан, очень полезно. Другой проблемой был «статус», который был установлен в Transient (из предыдущей версии). Я изменил это, и теперь я разбираю ответ сервера. Благодарю. – Hesam

+0

, пожалуйста, рада исправить вашу проблему. Хорошего дня :) –

Смежные вопросы