RxHttp 一条链发送请求之注解处理器 Generated API(四)

前言

在前面3篇文章中,咱们对RxHttp作了总体的介绍,并带领你们自定义Parser及Param,若是还没阅读,请查看php

若是还未阅读前面文章,请查看java

RxHttp 一条链发送请求,新一代Http请求神器(一)git

RxHttp 一条链发送请求之强大的数据解析功能(二)github

RxHttp 一条链发送请求之强大的Param类(三)post

RxHttp库已更新至1.0.4版本,详情请查看RxHttp 源码ui

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

Gradle 依赖

implementation 'com.rxjava.rxhttp:rxhttp:1.0.7'
//注解处理器,生成RxHttp类
annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.0.7'
复制代码

简介

在前面几片文章,有读者疑问,为啥要经过注解来生成RxHttp类,答案只有一个:为了使RxHttp更好用,经过@DefaultDomain注解,咱们能够很是方便的设置baseUrl,这多是目前对baseUrl最优雅的设置方案(欢迎打脸);经过@Domain ,咱们能够很是方便的为单个请求指定非默认的baseUrl;经过@Param @Parser注解,咱们就能够很方便的在RxHttp使用咱们自定义的Param及Parser。 下面将一一介绍。url

@DefaultDomain

现实开发中,大部人开发者都会将baseUrl 单独抽取出来,RxHttp也考虑到了这一点,RxHttp经过@DefaultDomain注解来配置baseUrl,看代码spa

public class Url {
    @DefaultDomain() //设置为默认域名
    public static String baseUrl = "http://ip.taobao.com/";
}
复制代码

rebuild一下项目,此时咱们发送请求就能够直接传入path路径,以下:code

RxHttp.get("/service/getIpInfo.php")
        .add("key", "value")
        .asString()  
        .subscribe(s -> { //这里的s为String类型,即Http请求的返回结果
           //成功回调
        }, throwable -> {
           //失败回调
        });
复制代码

RxHttp在发送请求前,会对url作判断,若是没有域名,就会自定加上默认的域名,也就是baseUrl。

@Domain

而后,若是咱们不想使用默认的域名呢?RxHttp也考虑到来,提供了一个@Domain注解,咱们再来看看用法:

public class Url {
    @Domain(name = "Update9158") //设置非默认域名,name 可不传,不传默认为变量的名称
    public static String update = "http://update.9158.com";

    @DefaultDomain() //设置为默认域名
    public static String baseUrl = "http://ip.taobao.com/";
}
复制代码

此时再rebuild一下项目,就会在RxHttp类中生成一个setDomainToUpdate9158IfAbsent()方法,其中的Update9158字符就是name指定的名字,而后发请求就能够这样:

RxHttp.get("/service/getIpInfo.php")
        .setDomainToUpdate9158IfAbsent()
        .add("key", "value")
        .asString()  
        .subscribe(s -> { //这里的s为String类型,即Http请求的返回结果
           //成功回调
        }, throwable -> {
           //失败回调
        });
复制代码

此时,RxHttp检测到url已经配置了域名,就不会再去使用默认的域名。一样的,setDomainToUpdate9158IfAbsent也会检测url 有没有配置域名,若是配置了,也不会使用咱们指定的域名。

注意:@Domain注解能够在多个地方使用,而@DefaultDomain()只能在一个地方使用,不然编译不经过,很好理解,默认域名只可能有一个。两个注解都要使用在public static修饰的String类型变量上,对final关键字没有要求,可写可不写,这就代表,baseUrl 能够动态更改,RxHttp始终会拿到的最新的baseUrl 。怎么样,是否是很nice!!

@Parser

先来看看源码

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

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

RxHttp 一条链发送请求之强大的数据解析功能(二)一文中,咱们也自定义了一个DataParser解析器,同时使用了@Parser(name = "Data")注解,咱们再次贴上源码

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

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

public class RxHttp {
  private Param param;

  private RxHttp(Param param) {
    this.param = param;
  }
  
  //经过注解Parser生成的方法
  public <T> Observable<T> asData(Class<T> type) {
    return from(DataParser.get(type));
  }
  //省略了其它方法
}
复制代码

此时咱们就能够直接使用fromDataParser方法去解析数据了。

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

可见,代码更加的简洁了

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

@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;
  }
  
  public static RxHttp with(Param param) {
    return new RxHttp(param);
  }
  
  //经过注解Param生成的方法
  public static RxHttp postEncryptJson(String url) {
    return with(new PostEncryptJsonParam(url));
  }
  //省略了其它方法
}
复制代码

接下来,咱们就能够直接经过RxHttp发送PostEncryptJsonParam请求

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

可见@Param标签,在必定程度上下降了耦合,使咱们并不须要关注具体的实现,使用 RxHttp类便可搞定任意请求

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

小结

最后,本文若是有写的不对的地方,请广大读者指出。 若是以为我写的不错,记得给我点赞RxHttp

转载请注明出处,谢谢🙏。

相关文章
相关标签/搜索