资讯专栏INFORMATION COLUMN

RxRetroHttp,为多套API请求适配而生

AWang / 1008人阅读

摘要:接口,用于指示,当然这是对于初始化时设置了的请求。当然,大家也是可以进行自定义配置的,配置方式如下当然各套请求之间的配置也是隔离的。

前言

"后端更新换代,新接口返回全用新的规则,老接口不变!"。。。WTF!

“我们的这几个网站,要做一个统一的App,后端都是现成的,这是API文档。”。。。几个网站的API规范和请求Host地址居然完全不一样?。。。WTF!

。。。千万只草泥马呼啸而过。。。实时切换BaseUrl?Retrofit注解全加上@Url?。。。无奈。。。

虽然说现在已经有很多Http请求框架了,也有很多针对RxJava+Retrofit的二次封装,其中也不乏很多动态替换BaseUrl的框架。但是如果需要更好的处理除了BaseUrl之外需求,比如针对各套API规则,不同的拦截处理、不同的返回异常逻辑处理等等,大多没有给予解决方案。因此,RxRetroHttp应运而生。

Github地址:https://github.com/BakerJQ/Rx...

总览

我们先来看看,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 getApi2Info();
}

我们看看不同在哪,下面是纯Retrofit的书写方式

public interface Api2Service {
    @GET("test/info")
    Observable> 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 implements IApiResult {
    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地址:https://github.com/BakerJQ/Rx...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14712.html

相关文章

  • JavaScript 设计模式(四):适配者模式

    摘要:与其它模式的异同适配器模式不会改变原有接口,这一点与装饰者模式和代理模式类似。代理模式适配器模式与代理模式最相似,同样都是创建一个新对象包装一次,实现对本体的调用。外观模式外观模式与适配器模式最大的区别,是定义了一个新的接口。 showImg(https://segmentfault.com/img/bVbul8d?w=800&h=600); 适配器模式:将一个类(对象)的接口(方法或...

    MingjunYang 评论0 收藏0
  • 前端基础之-响应式,flex,适配(px、em、rem、%、vm)

    摘要:屏幕分辨率指在横纵向上的像素点数,单位是,个像素点。屏幕像素密度与屏幕尺寸和屏幕分辨率有关物理像素像素设备像素物理像素分辨率买手机的时候会有一个的分辨率,那是屏幕的个呈像的点,一个点小方格为一个物理像素。 响应式-@media 响应式就是一个网站能够兼容多个终端—而不是为每个终端做一个特定的版本(响应式开发一套界面);随之而来的就是我们熟知的自适应,自适应设计指能使网页自适应显示在不同...

    Rocture 评论0 收藏0
  • 前端基础之-响应式,flex,适配(px、em、rem、%、vm)

    摘要:屏幕分辨率指在横纵向上的像素点数,单位是,个像素点。屏幕像素密度与屏幕尺寸和屏幕分辨率有关物理像素像素设备像素物理像素分辨率买手机的时候会有一个的分辨率,那是屏幕的个呈像的点,一个点小方格为一个物理像素。 响应式-@media 响应式就是一个网站能够兼容多个终端—而不是为每个终端做一个特定的版本(响应式开发一套界面);随之而来的就是我们熟知的自适应,自适应设计指能使网页自适应显示在不同...

    int64 评论0 收藏0
  • 前端基础之-响应式,flex,适配(px、em、rem、%、vm)

    摘要:屏幕分辨率指在横纵向上的像素点数,单位是,个像素点。屏幕像素密度与屏幕尺寸和屏幕分辨率有关物理像素像素设备像素物理像素分辨率买手机的时候会有一个的分辨率,那是屏幕的个呈像的点,一个点小方格为一个物理像素。 响应式-@media 响应式就是一个网站能够兼容多个终端—而不是为每个终端做一个特定的版本(响应式开发一套界面);随之而来的就是我们熟知的自适应,自适应设计指能使网页自适应显示在不同...

    baiy 评论0 收藏0
  • 前端国际化的另类方式

    摘要:前不久做了一个国际化的项目,基于和,里面用到了国际化,使用方式也很简单然后,页面所有的官方组件都变成了中文默认是英文。前端配置是指如何根据需要把需要展示的语言显示在页面,比如在中文环境下显示中文,英文环境下显示英文,用户看得到才算数。 关于国际化 一个项目发展到一定的环境或者一开始就是为多国打造的,就需要考虑国际化了。简单来说,就是一套页面,多套语言。 前不久做了一个国际化的项目,基于...

    FullStackDeveloper 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<