繁体   English   中英

在改造Android中处理错误响应

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM