接受来自Retrofit API请求的多个有效负载

时间:2017-11-20 02:30:22

标签: java android retrofit retrofit2

我的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();
        }
    });
}

后端返回一个String值数组。但是,如果发生错误,后端可能会返回以下有效负载结构:

{
   "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>并且不接受自定义错误有效内容模型。鉴于我创建了一个名为Error的新模型:

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

如何在发生错误时切换改装API方法的模型?

1 个答案:

答案 0 :(得分:1)

您可以使用ErrorUtils类来处理不成功的响应:

公共类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;
}

}

然后当您发现响应失败时,只需使用ErrorUtils类解析响应:

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

ApiError类:

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

}