RxRetroHttp为多套API请求适配而生
前言
"后端更新换代,新接口返回全用新的规则,老接口不变!"。。。wtf!
“我们的这几个网站,要做一个统一的app,后端都是现成的,这是api文档。”。。。几个网站的api规范和请求host地址居然完全不一样?。。。wtf!
。。。千万只*呼啸而过。。。实时切换baseurl?retrofit注解全加上@url?。。。无奈。。。
虽然说现在已经有很多http请求框架了,也有很多针对rxjava+retrofit的二次封装,其中也不乏很多动态替换baseurl的框架。但是如果需要更好的处理除了baseurl之外需求,比如针对各套api规则,不同的拦截处理、不同的返回异常逻辑处理等等,大多没有给予解决方案。因此,rxretrohttp应运而生。
总览
我们先来看看,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).getapi2info()
我们可以看到,这就是retrofit风格的调用方式。
在这里,api2service也就是retrofit风格的apiservice,但是也略有不同
@retrotag("api2") public interface api2service { @get("test/info") observable<api2info> getapi2info(); }
我们看看不同在哪,下面是纯retrofit的书写方式
public interface api2service { @get("test/info") observable<api2result<api2info>> getapi2info(); }
没错,区别就在于:
1、省去了基类的这一层包裹。这么做的原因是,个人认为,在apiservice这一层,每个接口定义都需要设置apiresult包裹是不人性的,哈哈哈。
2、retrotag接口,用于指示tag,当然这是对于初始化时设置了tag的api请求。
当然,如果你还是希望以基类包裹的方式,也是可以的,那就是在初始化的时候,不调用setapiresultclass方法就行了。
另外,如果你不想增加retrotag注解,也是可以的,那在调用的时候,就需要调用另一个方法,放入tag,如下:
rxretrohttp.create(api2service.class, "api2").getapi2info()
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的方式或许不是最好的方式,我也会继续尝试其他的方式,以对比便利性,如果大家有更好的方案提议,也希望能够留言告诉我,感谢大家。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接