欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

RxRetroHttp为多套API请求适配而生

程序员文章站 2022-03-08 17:15:11
前言 "后端更新换代,新接口返回全用新的规则,老接口不变!"。。。wtf! “我们的这几个网站,要做一个统一的app,后端都是现成的,这是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的方式或许不是最好的方式,我也会继续尝试其他的方式,以对比便利性,如果大家有更好的方案提议,也希望能够留言告诉我,感谢大家。

总结

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