[英]Handling error response in Retrofit android
我正在使用Retrofit作为我的网络库。 一切运行顺利。 我只是有一个新的要求,万一失败 ,服务器会在Json中给我回复 。 我想获取整个响应,现在在失败回调中使用RetrofitError ,而在任何RetrofitError属性中都没有给出服务器响应。
任何帮助将不胜感激。 谢谢。
我猜你想获取的是失败期间从api返回的json响应中的字段。 我认为失败的过程与成功的过程非常相似。 首先,您的响应对象需要具有一个字段以映射到json错误字段,或要从响应中提取的任何字段(成功或失败)。 在成功的情况下,您可以直接获取转换后的响应,但是在失败的情况下,您需要在返回的RetofitError对象上调用getResponse()以获取转换后的响应,然后提取返回的数据。
这是一个例子。
我有一个Rails后端,如果成功,它会用令牌响应;如果不成功,则会显示错误列表。 这是Rails控制器方法(如果有帮助的话),但最重要的是,我要检查创建失败是否存在json输入错误。
def create
@user = User.new(user_params)
if @user.save
sign_in_api(@user)
render json: { token: @issued_remember_token }, status: 201
else
render json: { errors: @user.errors.full_messages } , status: 406
end
end
这是我的改造电话
@POST(API_URL + "/signup")
void signup(@Body UserRequestParams requestParams,
Callback<SignupResponse> tokenParms);
这是我的SignupResponse对象
public class SignupResponse extends BaseResponse {
private String token;
public String getToken() {
return token;
}
}
public class BaseResponse {
private List<String> errors = new ArrayList<String>();
private Boolean mSuccessful = false;
public Response getRawResponse() {
return rawResponse;
}
public void setRawResponse(Response rawResponse) {
this.rawResponse = rawResponse;
}
private Response rawResponse;
public BaseResponse() {
super();
}
public List<String> getErrors() {
return errors;
}
public void setSuccessful(Boolean successful) {
mSuccessful = successful;
}
public Boolean isSuccessful() {
return mSuccessful;
}
}
结果是,改建作为回调过程的一部分填充了error字段,就像改成成功一样。 现在,我可以检查响应是否成功,然后在响应对象上调用适当的方法。 如果成功,错误将为null,否则为有效。
为了完整起见,这里是我的示例中涉及的其他两个方法/类。
@Subscribe
public void onSignup(SignupRequest event) {
System.out.println("inside api repo - making signup request");
mRailsApi.signup(event, new RailsApiCallback<SignupResponse>(mBus, new SignupResponse()));
}
public class RailsApiCallback<T extends BaseResponse> implements Callback<T> {
private Bus mBus;
private T mResponse;
public RailsApiCallback(Bus bus, T response) {
super();
mBus = bus;
mResponse = response;
}
@Override
public void failure(RetrofitError retrofitError) {
System.out.println(retrofitError.toString());
T response = retrofitError != null && retrofitError.getBody() != null ? (T) retrofitError.getBody() : mResponse ;
response.setRawResponse(retrofitError.getResponse());
response.setSuccessful(false);
System.out.println("posting response to bus");
mBus.post(response);
}
@Override
public void success(T convertedResponse, Response rawResponse) {
System.out.println(rawResponse.getBody());
T response = convertedResponse != null ? convertedResponse : mResponse ;
response.setSuccessful(true);
response.setRawResponse(rawResponse);
mBus.post(response);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.