Skip to content

返回自定义对象

liujingxing edited this page Feb 25, 2023 · 4 revisions

简单返回一个Student对象,通过toObservable(Class<T>)方法,如下:

RxHttp.postForm("/service/...")  //发送post表单请求
    .add("key", "value")         //添加参数,可调用多次
    .toObservable(Student.class)    //返回Student类型
    .subscribe(student -> {   
        //请求成功,这里就能拿到 Student对象               
    }, throwable -> {         
        //请求失败                
    });    

返回List<Student>列表对象,则可以通过toObservableList(Class<T>)方法,如下:

RxHttp.postForm("/service/...")  //发送post表单请求
    .add("key", "value")         //添加参数,可调用多次
    .toObservableList(Student.class)       //返回List<Student>类型
    .subscribe(students -> {   
        //请求成功,这里就能拿到 Student对象列表               
    }, throwable -> {         
        //请求失败                
    });    

解析Response<T>类型数据

数据结构如下:

public class Response<T> {
    private int    code;
    private String msg;
    private T      data;
    //这里省略get、set方法
}

解析Response<Student>数据,通过toObservableResponse(Class<T>)方法,并对code统一判断

RxHttp.postForm("/service/...")   //发送post表单请求
    .add("key", "value")          //添加参数,可调用多次
    .toObservableResponse(Student.class)    //返回Student类型,内部会对code判断
    .subscribe(student -> {   
        //请求成功且code正确,直接拿到Student对象               
    }, (OnError) error -> {         
        //失败回调
        int code = error.getErrorCode();  //拿到code字段
        String errorMsg = error.getErrorMsg() //拿到msg字段
                        
    });    

解析Response<List<Student>> 类型数据,通过toObservableResponseList(Class<T>)方法,并对code统一判断

RxHttp.postForm("/service/...")   //发送post表单请求
    .add("key", "value")          //添加参数,可调用多次
    .toObservableResponseList(Student.class)    //返回List<Student>类型,内部会对code判断
    .subscribe(students -> {   
        //请求成功且code正确,直接拿到List<Student>列表对象               
    }, (OnError) error -> {         
        //失败回调
        int code = error.getErrorCode();      //拿到code字段
        String errorMsg = error.getErrorMsg() //拿到msg字段               
    });    

解析Response<PageList<Student>> 分页列表数据,通过toObservableResponsePageList(Class<T>)方法,并对code统一判断,数据结构如下:

{
    "code": 0,
    "msg": "",
    "data": {
        "totalPage": 0,
        "list": []
    }
}

此时,调用RxHttp的toObservableResponsePageList(Class<T>)方法,如下:

RxHttp.postForm("/service/...")   //发送post表单请求
    .add("key", "value")          //添加参数,可调用多次
    .toObservableResponsePageList(Student.class)    //返回PageList<Student>类型
    .subscribe(pageList -> {   
        //请求成功,这里能拿到PageList<Student>列表对象 
       int totalPage = pageList.getTotalPage();   //总页数
       List<Student> students = pageList.getData();  //单页列表数据        
    }, (OnError) error -> {         
        //失败回调
        int code = error.getErrorCode();      //拿到code字段
        String errorMsg = error.getErrorMsg() //拿到msg字段              
    });    

注:上面的OnError接口并非是RxHttp内部提供的,而是自定义的,在Demo里可以找到

到这,估计很多人会问我:

  • 你的code在哪里判断的?
  • 我的code是100或者其它值才代表正确,怎么改?
  • 我的Response<T>类里面的字段名,跟你的都不一样,怎么该?
  • 你这成功的时候直接返回Response<T>里面的T,那我还要拿到code做其他的判断,执行不同业务逻辑,怎么办?

这里可以先告诉大家,toObservableResponse(Class<T>)toObservableResponseList(Class<T>)toObservableResponsePageList(Class<T>)这3个方法并不是RxHttp内部提供的,而是通过自定义解析器生成,里面的code判断、Response<T>类都是开发者自定义的,如何自定义解析器,请查看自定义Parser

duang、duang、duang !!! 划重点,其实所有的toObservableXxx方法,最终都是通过toObservable(Parser<T>)方法实现的,这里就不讲解了,想了解,请查看源码