2017-11-20 16 views
0

My Retrofit APIメソッドは現在、1つのペイロード構造を受け入れています。しかし、要求にエラーがあれば、バックエンドは異なるペイロード構造を返すかもしれません。例えばRetrofit APIリクエストから複数のペイロードを受け入れる

public void search(String term, final CallBack <ArrayList<String>> callBack) { 
    RetroGenerator.createService(APIServices.class).search(term).enqueue(new Callback<ArrayList<String>>() { 
      @Override 
      public void onResponse(Call<ArrayList<String>> call, Response<ArrayList<String>> response) { 
       if (response.isSuccessful()) { 
        callBack.onSuccess(response.body()); 
       } 

       return; 
      } 
      callBack.onError(); 
     } 

     @Override public void onFailure(Call<ArrayList<String>> call, Throwable t) { 
      callBack.onError(); 
     } 
    }); 
} 

バックエンドは、文字列値の配列を返しています。しかし、エラーが発生した場合、バックエンドは、以下のペイロード構造返すことがあります。

{ 
    "error": "Term can't be empty", 
    "code": 403 
} 

しかし、私のAPIメソッドは、セットアップで道を、それが唯一のJavaモデルを受け入れます。

APIインタフェース:

@FormUrlEncoded 
@POST("api/v1/search.json") 
Call<ArrayList<String>> search(@Field("term") String term); 

現在、それだけでArrayList<String>を受け入れていますし、カスタムエラーペイロードモデルを受け付けません。エラーが発生したとき

public class Error { 
    public String error; 
    public int code; 
} 

がどのように改造APIメソッドのモデルを切り替えることができます。私はErrorと呼ばれる新しいモデルを作成することを考えると?あなたが失敗したレスポンスを見つけたときだけで応答を解析し、

パブリッククラスErrorUtils次に{

public static ApiError parseError(Response<?> response) { 
    Converter<ResponseBody, ApiError> converter = ServiceGenerator.retrofit(). 
      responseBodyConverter(ApiError.class, new Annotation[0]); 

    ApiError apiError; 

    try { 
     apiError = converter.convert(response.errorBody()); 
    } catch (IOException e) { 
     apiError = new ApiError(); 
    } 

    return apiError; 
} 

}

答えて

1

あなたが失敗した応答を処理するためにErrorUtilsクラスを持つことができますErrorUtilsクラス:

if (!response.isSuccessful()) { 
    // ... 
    ApiError apiError = ErrorUtils.parseError(response); 
} 

ApiErro Rクラス:

public class ApiError { 
@SerializedName("error") 
private String mErrorDescription; 

@SerializedName("code") 
private Integer mErrorCode; 

public ApiError() {} 

public void setErrorCode(Integer code) { 
    this.mErrorCode = code; 
} 

public Integer getErrorCode() { 
    return mErrorCode; 
} 

public String getErrorDescription() { 
    return mErrorDescription; 
} 

public void setErrorDescription(String errorDescription) { 
    mErrorDescription = errorDescription; 
} 

}

+0

これが働きました。ありがとうございます – Dinuka

関連する問題