RxHttp 扩展篇之注解处理器 Generated API(八)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liujingxing93/article/details/88894126

如果还未阅读之前的文章,请移步
RxHttp 一条链发送请求,新一代Http请求神器(一)
RxHttp 介绍篇之生命周期、公共参数相关配置(二)
RxHttp 介绍篇之Parser介绍(三)
RxHttp 介绍篇之Param介绍(四)
RxHttp 介绍篇之多请求串行与并行(五)
RxHttp 扩展篇之Parser扩展(六)
RxHttp 扩展篇之Param扩展(七)
RxHttp 扩展篇之注解处理器 Generated API(八)

这篇文章将介绍如何使用注解自定义API

Gradle 依赖

implementation 'com.rxjava.rxhttp:rxhttp:1.0.0'
//注解处理器,生成RxHttp类
annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.0.0'

简介

RxHttp使用注解处理器来生产一个API,使用该流式 API 一次性调用到 Param、 HttpSender类中所有的选项,还可以通过注解扩展自定义选项,目前一共有3个注解,分别是@Param @Parser @Domain,下面将一一介绍。

使用 Generated API

Generated API 默认名为 RxHttp

先来看看如何使用RxHttp发送一个请求

String url = "http://ip.taobao.com/service/getIpInfo.php";
Disposable disposable = RxHttp.get(url) //这里get,代表Get请求
        .add("ip", "63.223.108.42")//添加参数
        .addHeader("accept", "*/*") //添加请求头
        .addHeader("connection", "Keep-Alive")
        .addHeader("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)")
        //SimpleParser是一个数据解析器,后续会有介绍,它需要传入一个泛型,此泛型决定Http的返回类型
        .fromSimpleParser(Response.class) //from操作符,是异步操作
        .observeOn(AndroidSchedulers.mainThread()) //主线程回调
        .subscribe(response -> {
            //参数类型由上面SimpleParser传入的泛型类型决定
            //走到这里说明Http请求成功,并且数据正确
        }, throwable -> {
            //Http请求出现异常,有可能是网络异常,数据异常等
        });

可以看到,一条链就完成一个请求的发送

@Param

先来看看@Param的源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface Param {
    //指定在RxHttp类中生成的静态方法名
    String methodName();
}

@Param标签只能作用于AbstractPostParam的实现类上,否则编译器会报错,指定方法名后,Rebuild一下项目,就会自动在RxHttp类下生成指定方法名的静态方法。

RxHttp 扩展篇之Param扩展(七)一文中,我们自定义了一个PostEncryptJsonParam,并为它使用了注解标签@Param(methodName = "postEncryptJson")我们再次贴上该类的源码

@Param(methodName = "postEncryptJson") //指定postEncryptJson为方法名
public class PostEncryptJsonParam extends AbstractPostParam {
     //省略内部代码
}

然后Rebuild 一下项目,就可以看到在RxHttp下多了一个postEncryptJson方法,并在方法内new 出了一个PostEncryptJsonParam对象传给了RxHttp

public class RxHttp {
  private Param param;

  private RxHttp(Param param) {
    this.param = param;
  }
  
  //通过注解Param生成的方法
  public static RxHttp postEncryptJson(String url) {
    return new RxHttp(new PostEncryptJsonParam(url));
  }
  //省略了其它方法
}

接下来,我们就可以直接通过RxHttp发送PostEncryptJsonParam请求

String url = "http://ip.taobao.com/service/getIpInfo.php";
Disposable disposable = RxHttp.postEncryptJson(url) //这里get,代表Get请求
        .add("ip", "63.223.108.42")//添加参数
        .addHeader("accept", "*/*") //添加请求头
        //省略部分代码

可见@Param标签,在一定程度上降低了耦合,使我们并不需要关注具体的实现,使用 RxHttp类即可搞定任意请求

注:@Param标签只能作用与Param接口的实现类,该类不能是接口、抽象类,且必须提供一个public 且仅带一个url参数的构造方法,在编译时会做检查。

@Parser

先来看看源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface Parser {
    //指定名字后,就会在RxHttp下生成fromXXX方法
    String name();
}

@Parser标签作用于Parser接口的实现类,指定名字后,Rebuild一下项目,就会在RxHttp下生成fromXXX方法。

RxHttp 扩展篇之Parser扩展(六)一文中,我们也自定义了一个DataParser解析器,同时使用了@Parser(name = "DataParser")注解,我们再次贴上源码

@Parser(name = "DataParser")
public class DataParser<T> extends AbstractParser<T> {
     //省略内部代码
}

然后Rebuild 一下项目,RxHttp下就会自动生产一个public <T> Observable<T> fromDataParser(Class<T> type)方法,如:

public class RxHttp {
  private Param param;

  private RxHttp(Param param) {
    this.param = param;
  }
  
  //通过注解Parser生成的方法
  public <T> Observable<T> fromDataParser(Class<T> type) {
    return HttpSender.from(param,DataParser.get(type));
  }
  //省略了其它方法
}

此时我们就可以直接使用fromDataParser方法去解析数据了。

String url = "http://ip.taobao.com/service/getIpInfo.php";
Disposable disposable = RxHttp.postEncryptJson(url) //这里get,代表Get请求
        .add("ip", "63.223.108.42")//添加参数
        .addHeader("accept", "*/*"); //添加请求头
        .fromDataParser(Response.class)
        ...省略部分代码

可见,代码更加的简洁了

注:@Parser注解只能作用与Parser的实现类,不能是接口和抽象类,且必须要提供一个静态的get方法,返回该实现类的一个实例对象,编译时会检查

@Domain

看名字能知道,该注解与域名有关,没错,该注解运用在变量上,如

public class Url {
    @Domain()//name可以不指定,不指定时,name的值等于变量的名称,这里为 taobao
    public static String taobao = "http://ip.taobao.com/";
    @Domain(name = "taobao1") 
    public static String taobao1 = "http://ip.taobao.com/";
}

然后Rebuild一下项目,RxHttp下就会生成以下两个方法

  //设置Url.taobao指定的域名,如果域名不存在的话
  public RxHttp setDomainTotaobaoIfAbsent() {
    String newUrl = addDomainIfAbsent(param.getSimpleUrl(), Url.taobao);
    param.setUrl(newUrl);
    return this;
  }
  //设置Url.taobao1指定的域名,如果域名不存在的话
  public RxHttp setDomainTotaobao1IfAbsent() {
    String newUrl = addDomainIfAbsent(param.getSimpleUrl(), Url.taobao1);
    param.setUrl(newUrl);
    return this;
  }

发送请求就可以这样

String url = "service/getIpInfo.php";
Disposable disposable = RxHttp.get(url) //这里get,代表Get请求
        .setDomainTotaobaoIfAbsent() //设置Url.taobao指定的域名,如果域名不存在的话
        .add("ip", "63.223.108.42")//添加参数
        .addHeader("accept", "*/*") //添加请求头
        .addHeader("connection", "Keep-Alive")
        .addHeader("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)")
        //SimpleParser是一个数据解析器,后续会有介绍,它需要传入一个泛型,此泛型决定Http的返回类型
        .fromSimpleParser(Response.class) //from操作符,是异步操作
        .observeOn(AndroidSchedulers.mainThread()) //主线程回调
        .subscribe(response -> {
            //参数类型由上面SimpleParser传入的泛型类型决定
            //走到这里说明Http请求成功,并且数据正确
        }, throwable -> {
            //Http请求出现异常,有可能是网络异常,数据异常等
        });

注:@Domain只能作用于public的静态变量,编译时会检查
ok,注解处理器讲解完毕,如有疑问,请留言。。

猜你喜欢

转载自blog.csdn.net/liujingxing93/article/details/88894126