2016-05-25 9 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); 
      } 
     }); 
    } 

私がリクエストを送信すると、これは私のサーバーの応答である:したがって、onResponseが呼び出される

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

FeatureResponseの新しいオブジェクトが作成されますとfeatureResponse.setResponse(response);が呼び出されます。上のコードでわかるように、私はHTTPステータスコードを取得しようとしています。しかし、問題はif (obj != null && obj instanceof DefaultResponse)は常にfalseであり、responseはクラスretrofit2.Responseのインスタンスです。

ResponseDefaultResponseに変換することはできますか?

答えて

0

私は、401などのエラーを取得しています、400はGsonでこの方法を使用しています:GsonPojoへの応答を変換する際

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 } 

} 

をまた、あなたは注釈を必要とする:

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 :あなたのbuild.gradleJson Schema to Pojo

compile 'com.google.code.gson:gson:2.6.2'

+1

素晴らしい仲間、非常に役立ちます。私の他の問題は、(以前のバージョンの)Transientに設定された 'status'でした。私はそれを変更し、私は今サーバーの応答を解析します。ありがとう。 – Hesam

+0

あなたの問題を解決してうれしいです。良い一日を過ごしてください :) –

関連する問題