当前位置: 移动技术网 > IT编程>移动开发>Android > RxRetroHttp为多套API请求适配而生

RxRetroHttp为多套API请求适配而生

2019年07月29日  | 移动技术网IT编程  | 我要评论

公司年会策划方案,谌龙激凸,丰城网络

前言

"后端更新换代,新接口返回全用新的规则,老接口不变!"。。。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的方式或许不是最好的方式,我也会继续尝试其他的方式,以对比便利性,如果大家有更好的方案提议,也希望能够留言告诉我,感谢大家。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对移动技术网的支持。如果你想了解更多相关内容请查看下面相关链接

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网