Retrofit请求成功数据错误统一拦截后抛自定义异常后,异步调用获取服务器返回来的错误信息

时间久了容易忘记。网上这一块资料不多很多不能用,自己摸索着写出来的,这里做个笔记方便以后查看。
项目用的mvp+rxjava+retrofit 但是某些地方特别简单的接口调用没必要创建很多文件加上时间太紧,就直接用retrofit异步请求了。

这是封装的拦截器的一部分代码。统一拦截状态码不为0 抛出自定义异常

public class CustomizeGsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
    
    

    private final Gson gson;
    private final TypeAdapter<T> adapter;

    CustomizeGsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
    
    
        this.gson = gson;
        this.adapter = adapter;
    }

    @Override
    public T convert(ResponseBody value) throws IOException {
    
    
        //把responsebody转为string
        String response = value.string();

        BaseBean baseResponse = gson.fromJson(response, BaseBean.class);
         // 这里只是为了检测code是否!=1,所以只解析HttpStatus中的字段,因为只要code和message就可以了
        if (baseResponse.getCode() != 0) {
    
    
            value.close();
            //抛出一个RuntimeException, 这里抛出的异常会到subscribe的onError()方法中统一处理
            throw new MyThrowable(baseResponse.getMsg(), baseResponse.getCode());
        }
        try {
    
    
            return adapter.fromJson(response);
        } finally {
    
    
            value.close();
        }
    }
}

正常用的时候异常信息传递给Observer 收到后presenter 调用view 失败的方法。没毛病

但是上面说的那种情况 不想这么走 retrofit 的回调是这样的

 RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
        RetrofitUtils.getApiUrl().requestCreateOrders(url, body).enqueue(new Callback<CreateOrderBean>() {
    
    
            @Override
            public void onResponse(Call<CreateOrderBean> call, Response<CreateOrderBean> response) {
    
    
            }

            @Override
            public void onFailure(Call<CreateOrderBean> call, Throwable t) {
    
    

            }
        });

怎么看自定义的message

   RetrofitUtils.getApiUrl().requestCreateOrders(url, body).enqueue(new Callback<CreateOrderBean>() {
    
    
            @Override
            public void onResponse(Call<CreateOrderBean> call, Response<CreateOrderBean> response) {
    
    
               }

            @Override
            public void onFailure(Call<CreateOrderBean> call, Throwable t) {
    
    
                String s = ((MyThrowable) t).getMessageContent();
  
            }
        });

关键代码就一句
((MyThrowable) t).getMessageContent();

猜你喜欢

转载自blog.csdn.net/qq_39178733/article/details/107691869