前言

在前面3篇文章中,我们对RxHttp做了整体的介绍,并带领大家自定义Parser及Param,如果还没阅读,请查看

如果还未阅读前面两篇文章,请查看

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

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

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

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

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

Gradle 依赖

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

简介

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

@DefaultDomain

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

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

rebuild一下项目,此时我们发送请求就可以直接传入path路径,如下:

  RxHttp.get("/service/getIpInfo.php").add("key", "value").from()  .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").from()  .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下生成fromXXX方法。

在RxHttp 一条链发送请求之强大的数据解析功能(二)一文中,我们也自定义了一个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 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", "*/*"); //添加请求头.fromDataParser(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

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

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

    简介 前面我们对RxHttp做了整体的介绍,我们知道,使用RxHttp库发送请求,有两种方式.一种通过Param+HttpSender的形式,另外一种是直接使用RxHttp类,而RxHttp类内部其实 ...

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

    简介 RxHttp是基于OkHttp的二次封装,并于RxJava做到无缝衔接,一条链就能发送一个完整的请求.主要功能如下: 支持Get.Post.Put.Delete等任意请求方式,可自定义请求方式 ...

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

    前言 在上一文中,我们对RxHttp做了一个整体的介绍,文章一经发表后,就收到了广大读者众多不同的声音,有对我的肯定,也有对RxHttp提出改进的建议,更有读者直接指出了我的不足,为此,我收获了很多, ...

  4. [转]RxHttp 一条链发送请求,新一代Http请求神器(一)

    简介 RxHttp是基于OkHttp的二次封装,并于RxJava做到无缝衔接,一条链就能发送一个完整的请求.主要功能如下: 支持Get.Post.Put.Delete等任意请求方式,可自定义请求方式 ...

  5. RxHttp-一条链发送请求之强大的数据解析功能(二),kotlin构造器

    }, throwable -> { //失败回调 }); 可以看到,直接使用fromListParser操作符,传入Student.class即可,它内部就是通过ListParser.get(S ...

  6. Java注解处理器使用详解

    文章转自:http://www.race604.com/annotation-processing/ 在这篇文章中,我将阐述怎样写一个注解处理器(Annotation Processor).在这篇教程 ...

  7. Java注解处理器(编译时注解)

    https://race604.com/annotation-processing/ Java中的注解(Annotation)是一个很神奇的东西,特别现在有很多Android库都是使用注解的方式来实现 ...

  8. java 命名代码检查-注解处理器

    命名代码检查 根据 <Java 语言规范( 第 3 版 ) > 中第6.8节的要求, Java 程序命名应当符合下列格式的书写规范: 类 ( 或接口 ) : 符合驼式命名法, 首字母大写. ...

  9. 【Android 组件化】路由组件 ( 注解处理器调试 )

    文章目录 一.添加断点 二.获取调试选项 三.创建 Gradle 调试任务 四.开始调试 五.博客资源 组件化系列博客 : [Android 组件化]从模块化到组件化 [Android 组件化]使用 ...

最新文章

  1. 若依前后端分离如何写移动端接口_前后端分离实践的架构设计
  2. Python 的数据类型
  3. Eclipse+PyDev+Django+Mysql搭建Python web开发环境
  4. 《CUDA高性能并行计算》----2.2 需要知道的CUDA API和C语言拓展
  5. 学习笔记之12个月提升计划
  6. maven install 错误
  7. C/C++中break、return、continue和goto在循环语句中的使用
  8. python编程是啥-python编程语言是什么?它能做什么?
  9. 萦绕在头脑中的思路_我的编程梦们 【更新至2010.06.03】
  10. 指针 多维数组 数组指针 指针数组
  11. Sketch 52 破解版 最佳Mac产品原型设计工具
  12. DCC2020:VVC帧内预测中基于梯度的CU划分早停止
  13. filco的pin码_filco蓝牙键盘配对流程,filco 忍者二代 蓝牙怎么
  14. 解决问题:failed to lazily initialize a collection of role异常解决
  15. 接入支付宝支付 错误码4000,排查方法——开发记录
  16. 微信公众号历史消息栏设置
  17. Android通讯录导入到Iphone
  18. 用户登录短信验证码的实现
  19. H.264向H.265的转变及其相关技术
  20. win7电脑开不了机,CPU风扇转一下,停一下

热门文章

  1. ADO.NET知识点
  2. jeecg中的树形控件demo
  3. 步步为营-49-视图
  4. 资源--toast的五种使用方式
  5. postgreSQL源码分析——索引的建立与使用——GIST索引(3)
  6. android p 游戏调节器,游戏调节器(Game Tuner)
  7. php 字符串中文截取,PHP 截取中文字符串(支持多种编码)
  8. google android ui,UI Automator
  9. 的ppt_PPT制作小白,如和做好PPT
  10. python https 协议_Python中连接HTTPS网站如何强制使用TLSv1协议