内容简介:"后端更新换代,新接口返回全用新的规则,老接口不变!"。。。WTF!“我们的这几个网站,要做一个统一的App,后端都是现成的,这是API文档。”。。。几个网站的API规范和请求Host地址居然完全不一样?。。。WTF!。。。千万只草泥马呼啸而过。。。实时切换BaseUrl?Retrofit注解全加上@Url?。。。无奈。。。
"后端更新换代,新接口返回全用新的规则,老接口不变!"。。。WTF!
“我们的这几个网站,要做一个统一的App,后端都是现成的,这是API文档。”。。。几个网站的API规范和请求Host地址居然完全不一样?。。。WTF!
。。。千万只草泥马呼啸而过。。。实时切换BaseUrl?Retrofit注解全加上@Url?。。。无奈。。。
虽然说现在已经有很多Http请求框架了,也有很多针对RxJava+Retrofit的二次封装,但是大多没有针对上述特殊情况下的处理方案。因此,RxRetroHttp应运而生。
Github地址: github.com/BakerJQ/RxR…
总览
我们先来看看,RxRetroHttp是通过什么方式处理这种情况的。
初始化
首先,大多库的必备阶段:初始化。我们先来看看初始化的代码,在Application的onCreate中执行
RxRetroHttp.init(this) .setBaseUrl("http://api1.com/") .setApiResultClass(Api1Result.class) .generateRetroClient() 复制代码
这样,初始化就做完了。。。此处应有掌声。。。
“我掌你大爷!!!说好的处理多套API规则呢!!!”
额咳。。。客观莫急。。。待我徐徐道来
通过刚刚的初始化,你已经设置了App中主API请求的基本配置。如果你的App中,就像前言里描述的那样,需要对接多套API规则,那么在初始化之后,再加入如下代码
RxRetroHttp.getInstance() .setBaseUrl("https://api2.com/") .setApiResultClass(Api2Result.class) .generateRetroClient("API2") 复制代码
相信大家已经看出区别了吧,没错,就是在generateRetroClient这个方法中,加入了一个Tag,而这个Tag,就是处理多套API请求的关键。
在setApiResultClass方法中,传入的就是对于API规范的基类,具体情况会在后面讲到。
调用
初始化完成后,如何调用呢,请看代码
RxRetroHttp.create(Api2Service.class, "API2").getApi2Info() 复制代码
我们可以看到,这就是Retrofit风格的调用方式,而不同的,就是增加了一个Tag,而这个Tag,就是在初始化阶段设置的Tag,当然,对于主API来说,Tag是不需要的。
在这里,Api2Service也就是Retrofit风格的ApiService,但是也略有不同
public interface Api2Service { @GET("test/info") Observable<Api2Info> getApi2Info(); } 复制代码
我们看看不同在哪,下面是纯Retrofit的书写方式
public interface Api2Service { @GET("test/info") Observable<Api2Result<Api2Info>> getApi2Info(); } 复制代码
没错,区别就在于,省去了基类的这一层包裹。这么做的原因是,个人认为,在ApiService这一层,不应该出现用于区分各套API规则的相关代码。
当然,如果你还是希望以基类包裹的方式,也是可以的,那就是在初始化的时候,不调用setApiResultClass方法就行了。
ApiResult
现在,我们来看看ApiResult。
在setApiResultClass方法中传入的,是实现了IApiResult接口的请求返回基类,简单的样例代码如下
public class Api2Result<T> implements IApiResult<T> { private int code; private String msg; private T result; @Override public boolean isSuccess(){ return code == 1; } @Override public T getData(){ return result; } @Override public String getResultMsg(){ return msg; } @Override public String getResultCode(){ return String.valueOf(code); } @Override public String getDataField(){ return "result"; } } 复制代码
其对应的返回json如下
{ code: 1, msg: "请求成功", result: { ... } } 复制代码
这是一个较为常用的API返回格式,而我们所要做的,就是实现几个基本方法,其中,isSuccess()返回的是请求成功的判断,getData()返回的是请求到的具体数据,getResultMsg()返回的是API请求信息,getResultCode()表示返回码,getDataField()返回的是json数据中表示具体数据的字段(在上面的json例子中,就是“result”)。
更多配置
Http请求不可能没有相关的配置,而本框架并没有为大家内置很多配置方法,原因是,我认为这并不是本框架的主要功能。当然,大家也是可以进行自定义配置的,配置方式如下:
RxRetroHttp.init(this).setXXX().setXXX(); Retrofit.Builder retrofitBuilder = RxRetroHttp.getRetrofitBuilder(); retrofitBuilder.setXXX().setXXX(); OkHttpClient.Builder okHttpBuilder = RxRetroHttp.getOkHttpClientBuilder(); okHttpBuilder.setXXX().setXXX(); RxRetroHttp.getInstance().generateRetroClient(); //RxRetroHttp.getInstance().generateRetroClient("YourTag") 复制代码
当然各套API请求之间的配置也是隔离的。框架也提供了一些简单的快捷配置方法,比如addInterceptor、addNetworkInterceptor等,更多的配置可以通过上述方式,获取retrofitBuilder和okHttpBuilder来配置。
总结
通过Tag的方式或许不是最好的方式,我也会继续尝试注解等其他的方式,以对比便利性,如果大家有更好的方案提议,也希望能够通过提issuer的方式告诉我,感谢大家。
更具体的使用方式,欢迎来GitHub仓库里的Demo查看,也欢迎和感谢各位Star支持。
再次贴一下Github地址: github.com/BakerJQ/RxR…
以上所述就是小编给大家介绍的《RxRetroHttp,为多套API请求适配而生》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Git多套配置的条件应用
- 同一微服务连接多套RocketMQ集群
- android 一套代码多用 以及 多套代码用于一个项目
- 搞定 Spring Boot 多数据源(一):多套源策略
- JEECG 3.7.7 发布,增加多套主流 UI 代码生成器模板
- JEECG 3.7.7 闪电版本发布,增加多套主流UI代码生成器模板
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
GOOGLE HACKS
Rael Dornfest、Tara Calishain / 卞军、谢伟华、朱炜 / 电子工业 / 2006-1 / 49.00元
GOOGLE HACKS巧妙使用网络搜索的技巧和工具(第二版)一起来看看 《GOOGLE HACKS》 这本书的介绍吧!