Rx系列学习笔记_使用okhttp拦截器统一处理返回请求

之前我们进行了一个简单的请求。但是我们发现api的所以的Observable的类型都是要进行一个ResponseData包裹。ResponseData的代码如下:


public class ResponseData {

    private String ErrorCode;
    private String ErrorMsg;
    private String Status;
    private T Data;

    public String getErrorCode() {
        return ErrorCode;
    }

    public void setErrorCode(String ErrorCode) {
        this.ErrorCode = ErrorCode;
    }

    public String getErrorMsg() {
        return ErrorMsg;
    }

    public void setErrorMsg(String ErrorMsg) {
        this.ErrorMsg = ErrorMsg;
    }

    public String getStatus() {
        return Status;
    }

    public void setStatus(String Status) {
        this.Status = Status;
    }

    public T getData() {
        return Data;
    }

    public void setData(T Data) {
        this.Data = Data;
    }

}

结果

 .flatMap(new Func1, Observable>>() {
                    @Override
                    public Observable> call(ResponseData checkDetailsDataResponseData) {
                        return request.getMyApi().getRecordDetail2(checkDetailsDataResponseData.getData().getSerialNumber());
                    }
                })

这里的flatMap中,我们new 的Func1中都是包裹的ResponseData。我们的目标就是使用的时候可以直接返回我们想要的类型。比如这里我我们想要的是一个CheckDetailsData对象,那我们最终要变成的就是下面这样的模式,返回的数据我们直接使用不用再去除外层的包裹。

new Func1, Observable...

之前大家应该都看过RxJava 与 Retrofit 结合的最佳实践 这里的处理方式是这样的。

1.先在Retrofit请求类中创建一个内部类HttpResultFunc

//用来统一处理Http的resultCode,并将HttpResult的Data部分剥离出来返回给subscriber,这里的HttpResult就是我们这里的ResponseData.
private class HttpResultFunc<T> implements Func1<HttpResult<T>, T>{

    @Override
    public T call(HttpResult httpResult) {
        if (httpResult.getResultCode() != 0) {
            throw new ApiException(httpResult.getResultCode());
        }
        return httpResult.getData();
    }
}

2.具体的使用

movieService.getTopMovie(start, count)
            .map(new HttpResultFunc>())
            .subscribeOn(Schedulers.io())
            .unsubscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(subscriber);

上面的方式也是可以实现数据统一处理请求返回。他的异常什么的数据都是通过ApiException来处理。但是这里面在map中会多次去new这个对象,多次请求就会多次去创造。文章的评论下也有人提这个问题,我这个菜鸡真的是蒙的,但是没办法还得改,他说了一个拦截器,所以我就去查了查,文章还是有的。可以通过Okhttp的拦截器直接拦截处理。

 httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient okHttpClient =new OkHttpClient.Builder()
                .addInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {

                        Request request = chain.request();
                        //这里对你自己的Response进行处理后重新返回一个Response
                        Response responseNew=filterResponse(request,chain);
                        return responseNew;
                    }
                })
                .addInterceptor(httpLoggingInterceptor)
                .build();
        retrofitBuild.client(okHttpClient);

参考

http://blog.csdn.net/csdn_lqr/article/details/61420753

你可能感兴趣的:(Retrofit)