我的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方法的模型?
答案 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;
}
}