在将其传递给调用活动之前,在Retrofit中捕获http响应

时间:2014-04-30 08:27:15

标签: android retrofit

现在我们正在使用这样的改造:

service.executeSomeRequest(UserPreferenceRequest userPreferenceRequest, new Callback<UserPreferenceResponse>() {
    @Override
    public void success(UserPreferenceResponse responseCallback, Response response) {
        if (responseCallback.getStatus() == ResponseStatus.OK) {
            // Everything is OK, process response
        } else {
            ApiErrorProcessor.process(responseCallback.getError());
        }
    }

    @Override
    public void failure(RetrofitError retrofitError) {
        ServerErrorProcessor.process(retrofitError);
    }
});

但是我们有很多请求,实际上,我们实现的每个请求都要求我们编写相同的错误代码处理(对于API和服务器错误),这会复制代码。

我们想要的只是覆盖感兴趣的方法,如果没有提供实现,则执行默认实现。

这样的事情:

service.executeSomeRequest(UserPreferenceRequest userPreferenceRequest, new     
    CustomCallback<UserPreferenceResponse>() {
            @Override
            public void success(UserPreferenceResponse responseCallback, Response response) {
                super.success(responseCallback, response);
                // Everything is OK, process response
            }
    });

CustomCallback将处理API和服务器错误,如果一切正常,则只将结果传递给调用活动。

在构建RestAdapter时,setRequestInterceptor();允许我在发出请求之前捕获请求,我在想类似的事情,比如setResponseInterceptor(),这样我就可以抓住在将其传递给活动之前的响应,并处理一般错误,但没有找到类似的东西。

2 个答案:

答案 0 :(得分:10)

您的自定义回调可以先处理基类中的响应,然后委托给抽象方法。

public interface StatusResponse {
  Status getStatus();
}

public abstract class CustomCallback<T extends StatusResponse> implements Callback<T> {
  @Override public final void success(T data, Response response) {
    if (data.getStatus() == Status.OK) {
      success(data);
    } else {
      // Handle error..
    }
  }

  public abstract void success(T data);
}

答案 1 :(得分:2)

您可以将改装请求与事件总线相结合,并有一个干净,集中的点来处理您的回复。

您需要做的就是定义一个像这样的Composed对象:

public class GetUsers {
// Retrofit Request
public static final class Request {}

// Retrofit Callback
public static final class Callback 
      implements retrofit.Callback<Response response> {

    @Override
    public void success(Response response, 
         Response retrofitResponse) {
         // .... handle the code
         BusManager.post(new Event());
    }

    @Override
    public void failure(RetrofitError error) {}
         BusManager.post(new RetrofitErrorEvent(error));
    }

// Otto Event
public static final class Event {}

此对象定义请求,回调和事件,此对象是改装请求的源。

 public void getUsers(){
     request.users(new GetUsers.Request(), new GetUsers.Callback());
 }

在此之后,您的主要课程如下所示:

public void onResume(){    
   controller.getUsers();
}

@Subscribe
public void onGetPostsEvent(GetPosts.Event event){
    textView.setText(event.getText());
}

有关更详细的说明,请查看此博文: Otto + Retrofit – An elegant solution for Web Requests您可以找到一个有效的示例here