RxHttp 让你眼前一亮的Http请求框架( 三 )

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

  • 你的code在哪里判断的?
  • 我的code是100或者其它值才代表正确,怎么改?
  • 我的Response<T>类里面的字段名,跟你的都不一样,怎么该?
  • 你这成功的时候直接返回Response<T>里面的T,那我还要拿到code做其他的判断,执行不同业务逻辑,怎么办?
这里可以先告诉大家,asResponse(Class<T>)、asResponseList(Class<T>)、asResponsePageList(Class<T>)这3个方法并不是RxHttp内部提供的,而是通过自定义解析器生成,里面的code判断、Response<T>类都是开发者自定义的,如何自定义解析器,请查看本文5.1章节----自定义Parser 。
接着回答第4个问题,如何拿到code做其他的业务逻辑判断,很简单,我们只需用OnError接口处理错误回调即可,如下:
RxHttp.postForm("/service/...")//发送post表单请求.add("key", "value")//添加参数,可调用多次.asResponse(Student.class)//返回Student类型.subscribe(student -> {//请求成功,这里能拿到 Student对象}, (OnError) error -> {//注意,这里要用OnError接口,其中error是一个ErrorInfo对象//失败回调//拿到code字段,此时就可以对code做判断,执行不同的业务逻辑int code = error.getErrorCode();String errorMsg = error.getErrorMsg()//拿到msg字段});注:上面的OnError接口并非是RxHttp内部提供的,而是自定义的,在Demo里可以找到
以上介绍的5个asXxx方法,可以说基本涵盖80%以上的业务场景,接下来我们看看RxHttp都提供了哪些asXxx方法,如下:
RxHttp 让你眼前一亮的Http请求框架

文章插图
 
RxHttp内部共提供了23个asXXX方法,其中:
  • 有7个是返回基本类型的包装类型,如:asInteger、asBoolean、asLong等等;
  • 还有7个是返回对象类型,如:asString、asBitmap、asList、asMap(3个)以及最常用asObject方法;
  • 剩下9个是asParser(Parser<T>)、 asUpload系列方法及asDownload系列方法 。
duang、duang、duang !!! 划重点,这里我可以告诉大家,其实前面的14个方法,最终都是通过asParser(Parser<T>)方法实现的,具体实现过程,这里先跳过,后续会详细讲解 。
3.3.3、第三部曲:订阅回调这一步就很简单了,在第二部曲中,asXxx方法会返回Observable<T>对象,没错,就是RxJava内部的Observable<T>对象,此时我们便可通过subscribe系列方法订阅回调,如下:
//不处理任何回调RxHttp.postForm("/service/...")//发送post表单请求.add("key", "value")//添加参数,可调用多次.asResponseList(Student.class)//返回List<Student>类型.subscribe();//不订阅任何回调//仅订阅成功回调RxHttp.postForm("/service/...")//发送post表单请求.add("key", "value")//添加参数,可调用多次.asResponseList(Student.class)//返回List<Student>类型.subscribe(students -> {//请求成功,这里能拿到List<Student>列表对象});//订阅成功与失败回调RxHttp.postForm("/service/...")//发送post表单请求.add("key", "value")//添加参数,可调用多次.asResponseList(Student.class)//返回List<Student>类型.subscribe(students -> {//请求成功,这里能拿到List<Student>列表对象}, throwable -> {//请求失败});//等等,省略另外,我们还可以订阅请求开始/结束的回调,如下:
RxHttp.get("/service/...").asString().observeOn(AndroidSchedulers.mainThread()).doOnSubscribe(disposable -> {//请求开始,当前在主线程回调}).doFinally(() -> {//请求结束,当前在主线程回调}).as(RxLife.as(this))//感知生命周期.subscribe(pageList -> {//成功回调,当前在主线程回调}, (OnError) error -> {//失败回调,当前在主线程回调});到这,请求三部曲介绍完毕,接着,将介绍其它常用的功能
3.4、初始化//设置debug模式,默认为false,设置为true后,发请求,过滤"RxHttp"能看到请求日志RxHttp.setDebug(boolean debug)//非必须,只能初始化一次,第二次将抛出异常RxHttp.init(OkHttpClient okHttpClient)//或者,调试模式下会有日志输出RxHttp.init(OkHttpClient okHttpClient, boolean debug)此步骤是非必须的,如需要添加拦截器等其他业务需求,则可调用init方法进行初始化,不初始化或者传入null即代表使用默认OkHttpClient对象,建议在Application中初始化,默认的OkHttpClient对象在HttpSender类中可以找到,如下:
private static OkHttpClient getDefaultOkHttpClient() {X509TrustManager trustAllCert = new X509TrustManagerImpl();SSLSocketFactory sslSocketFactory = new SSLSocketFactoryImpl(trustAllCert);return new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).sslSocketFactory(sslSocketFactory, trustAllCert) //添加信任证书.hostnameVerifier((hostname, session) -> true) //忽略host验证.build();}


推荐阅读