简介

前面我们对RxHttp做了整体的介绍,我们知道,使用RxHttp库发送请求,有两种方式。一种通过Param+HttpSender的形式,另外一种是直接使用RxHttp类,而RxHttp类内部其实就是通过Param+HttpSender实现的,我们可以理解为RxHttp类是Param的代理类。为此,本文将详细讲解Param类。

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

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

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

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

Param结构

首先,附上一张Param类的继承关系图,下图中蓝色标注的为接口类。

下面将对上图中的常用类及方法做介绍。

Param介绍

在前文中,我们介绍了RxHttp的请求三部曲,如下:

  RxHttp.get("http://...")              //第一步,确定请求方式.asString()                     //第二步,确定返回类型.subscribe(s -> {               //第三部  订阅观察者//成功回调}, throwable -> {//失败回调});
复制代码

而其中第一步,内部其实就是操作Param类,在这一步,我们不仅可以选择请求方式,还可以添加参数、添加请求头、添加文件对象等常用的操作,下面详细讲解。

请求方式

首先,我们来看看Param都给我们提供了哪些请求方式:

上图为Param提供的一系列静态方法,看名字应该也能知道,其中get方法对应的就是Get请求,同理postXxxputXxx等方法就是对应的PostPut等请求,而考虑到Post等请求又可以有不同的形式,故提供了postFormpostJson方法,其中前者是表单形式,后者是Json形式。现实开发中,如果还有其它的形式的请求(如:发送加密的请求),就需要我们自定义Param类,以满足我们的业务需求,后续会讲解。

现在我们来看看Param是怎么定义的:

public interface Param extends ParamBuilder, HeadersBuilder, NoBodyRequest, RequestBuilder {//Get请求static Param get(@NonNull String url) {return GetParam.with(url);}//Post请求,参数以Form表单键值对的形式提交static Param postForm(@NonNull String url) {return PostFormParam.with(url);}//省略其它方法
}
复制代码

可以看到Param就是一个接口,并且继承了ParamBuilder、HeadersBuilder、NoBodyRequest、RequestBuilder这四个接口

添加请求参数

确定了请求方式后,我们就需要添加请求参数,RxHttp提供了3个方法:

//对参数的操作都在此接口里
public interface ParamBuilder {//添加单个参数Param add(String key, Object value);//通过map添加多个参数Param add(Map<? extends String, ?> map);//设置json字符串参数,调用此方法后,通过上面两个add方法添加的参数将失效;非Json请求调用此方法无任何作用Param setJsonParams(String jsonParams);//省略若干方法
}
复制代码

第一个是添加单个参数,其中value是Object类型,故我们可以添加任意类型的参数,而不用进行强转(这一点对于强迫症患者的我,真的很实用);第二个是通过map对象添加多个参数;第三个方法setJsonParams仅对Json形式的请求生效,如:postJsonputJsonpatchJsondeleteJson,此方法有两点需要注意:

  • 非Json形式的请求调用此方法将不会产生任何作用
  • Json形式的请求调用此方法后,不管是之前还是后面通过add方法添加的参数都将失效

注:Param 内部是通过LinkedHashMap存储参数。

添加请求头

对请求头的操作,都封装在一个接口里,代码如下:

public interface HeadersBuilder {Headers getHeaders();String getHeader(String key);Headers.Builder getHeadersBuilder();Param setHeadersBuilder(Headers.Builder builder);Param addHeader(String key, String value);Param addHeader(String line);Param setHeader(String key, String value);Param removeAllHeader(String key);
}
复制代码

在上面的HeadersHeaders.Builder都是OkHttp内部提供的类,故可以知道在Param内部是通过Headers.Builder存储的请求头信息。

添加文件

Param内部目前仅提供了一个添加文件的方法,如下:

//对参数的操作都在此接口里
public interface ParamBuilder {/*** <p>添加文件对象* <P>默认不支持,如有需要,自行扩展,参考{@link PostFormParam}** @param key  键* @param file 文件对象* @return Param*/default Param add(String key, File file) {throw new UnsupportedOperationException("Please override if you need");}//省略若干方法
}
复制代码

可以看到,此方法默认会抛出一个UnsupportedOperationException异常,即代表不支持这个操作,如果要支持,需要重写此方法。目前RxHttp内部仅有postForm请求重写了此方法,故仅有postForm请求支持文件上传,其它请求调用此方法,将直接抛出异常;若自定义的请求要支持文件上传,请重写此方法。

重新设置Url

我们知道,要拿到Param对象就必须调用相关静态方法,并传入url。然后现实开发中,我们可能需要动态更改url,又或者我们需要拿到当前url做一些判断,为此RxHttp提供了相关方法,我们来看看

public interface ParamBuilder {Param setUrl(@NonNull String url);
}
复制代码
public interface NoBodyRequest {/*** @return 带参数的url*/String getUrl();/*** @return 不带参数的url*/String getSimpleUrl();//省略相关方法
}
复制代码

setUrl好理解,传入一个url即可,需要特别说明的是getUrlgetSimpleUrl方法,其中前者会将参数以Get请求的形式拼接在url后面,并返回;而后者仅返回我们传入的url对象。(在RxHttp库内部,Get、Head请求会调用getUrl方法,其它请求皆调用getSimpleUrl方法)

自定义Param

从上面的结构图,我们可以看到,RxHttp内部提供了10个类,不同形式及方式的请求,然后,现实开发中,它并不能满足我们的业务场景,此时就需要我们自定义Param。看上图我们知道,所有Param的具体实现类,都间接继承与AbstractParam类,而对于同一种请求,例如PostFormParamPostJsonParam都继承于AbstractPostParam。因此,我们要自定义Param,可以继承AbstractXxxParam类即可。 例如,我们现在要实现一个Post请求,参数以加密后的Json字符串发出,代码就可以这些写

public class PostEncryptJsonParam extends AbstractPostParam {public PostEncryptJsonParam(String url) {super(url);}/*** @return 根据自己的业务需求返回对应的RequestBody*/@Overridepublic RequestBody getRequestBody() {return null;}
}
复制代码

可以看到,我们只需要实现一个getRequestBody()方法,并返回一个RequestBody对象即可,我们再来看看实现

@Param(methodName = "postEncryptJson")
public class PostEncryptJsonParam extends AbstractPostParam {private static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json;charset=utf-8");public PostEncryptJsonParam(String url) {super(url);}/*** @return 根据自己的业务需求返回对应的RequestBody*/@Overridepublic RequestBody getRequestBody() {//我们要发送Post请求,参数以加密后的json形式发出//第一步,将参数转换为Json字符串JsonObject jsonObject = BuildUtil.mapToJson(this);String json = jsonObject.toString();//第二步,加密byte[] encryptByte = encrypt(json, "RxHttp");//第三部,创建RequestBody并返回RequestBody requestBody = RequestBody.create(MEDIA_TYPE_JSON, encryptByte);return requestBody;}/*** @param content  要加密的字符串* @param password 密码* @return 加密后的字节数组*/private byte[] encrypt(String content, String password) {//加密代码省略return null;}
}
复制代码

可以看到,非常简单,首先将参数转换为Json字符串,然后进行加密,最后根据加密后的数据创建RequestBody对象并返回即可,现在我们来看看如何使用PostEncryptJsonParam这个类。

注:我们在PostEncryptJsonParam类上使用了注解@Param(methodName = "postEncryptJson"),Rebuild一下项目,就会在RxHttp类下生成一个static RxHttp postEncryptJson(String url)的静态方法。 关于注解的使用,请查看RxHttp 扩展篇之注解处理器 Generated API(八) 此时我们就可以这么做

  String url = "http://www....";RxHttp.postEncryptJson(url)  //postEncryptJson 是使用注解生成的方法.add("key1", "value1").add("key2", "value3")//添加参数.asData(Address.class) //asXXX操作符,是异步操作.as(RxLife.asOnMain(this)) //感知生命周期,并在主线程回调.subscribe(address -> {//accept方法参数类型由上面DataParser传入的泛型类型决定//走到这里说明Http请求成功,并且数据正确}, throwable -> {//Http请求出现异常,有可能是网络异常,数据异常等});
复制代码

可以看到,使用RxHttp.postEncryptJson(url)静态方法得到PostEncryptJsonParam对象,并添加相关参数即可,其它逻辑没有任何改变。

到这,我可以告诉你,AbstractPostParam、AbstractPutParam、AbstractPatchParam、AbstractDeleteParam这4个抽象类,其实是一样的逻辑,都只需要实现getRequestBody()方法即可。

小结

到这,你会发现,Param在RxHttp库中是一个非常重要的角色,它提供了非常多简单易用的Api,这使得RxHttp非常的好用。

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

转载请注明出处,谢谢? 注解使用请查看

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

转载于:https://juejin.im/post/5cc47e575188252da72219ca

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

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

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

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

    前言 在前面3篇文章中,我们对RxHttp做了整体的介绍,并带领大家自定义Parser及Param,如果还没阅读,请查看 如果还未阅读前面两篇文章,请查看 RxHttp 一条链发送请求,新一代Http ...

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

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

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

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

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

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

  6. 二、scrapy爬虫框架——scrapy构造并发送请求

    scrapy数据建模与请求 学习目标: 应用 在scrapy项目中进行建模 应用 构造Request对象,并发送请求 应用 利用meta参数在不同的解析函数中传递数据 1. 数据建模 通常在做项目的过 ...

  7. java后台获取流_java后台发送请求获取数据,并解析json数据

    packagecom.bs.utils;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.io.Print ...

  8. python一张纸折叠到珠峰高度_python实现seo疯狂外链发送工具

    网站外链发送工具 进来无事,抽空用python实现seo疯狂发送外链的工具.外链对网站优化来说是一个加分项,外链越多.质量越高这么对网站优化也越有利.通常网上有很多外链发送工具,其实是对各大网站平台插 ...

  9. php CURL 发送请求详解

    cURL可以使用URL的语法模拟浏览器来传输数据,因为它是模拟浏览器,因此它同样支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 ...

最新文章

  1. QCustomPlot使用手冊(三)
  2. 深入浅出Spring Security(一):三句话解释框架原理
  3. 教你如何保养iphone电池
  4. 小米一键上锁工具_小米新品人脸识别智能锁:3D识别加红外,开门只需看一眼...
  5. 编程语言基础 c语言同步教案,C语言程序设计基实验教案.doc
  6. android跨进程关闭服务器,Android IPC机制(五)用Socket实现跨进程聊天程序
  7. Python3+Selenium3+Unittest+ddt+Requests 接口自动化测试框架
  8. DB2sql关键字——ALTER TABLE ....ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE
  9. Axure 汉化教程
  10. win10 安装sqlserver2000
  11. 小程序对接腾讯云IM即时聊天
  12. MySQL Order By 使用方法
  13. 根据IP统计网站访问次数
  14. translate()方法
  15. python去除视频马赛克_python使用opencv实现马赛克效果示例
  16. 关于生成树的一些小东西
  17. java星星图案总结
  18. [Eclipse]GEF入门系列(三、应用实例)
  19. js中的escape方法有什么用?
  20. 什么是对象,如何面向对象,为什么要面向对象

热门文章

  1. C语言-查找顺序表中的最大值
  2. python 解方程 sympy_Python数据处理篇之Sympy系列(五)---解方程
  3. php打包mysql_PHP封装MySQL的单例
  4. js面向对象2--原型
  5. Nikitosh 和异或 —— 一道 trie 树的题用可持久化 trie 水 然后翻车了...
  6. Python自定义分页组件
  7. [bzoj4881][Lydsy2017年5月月赛]线段游戏
  8. 交叉编译Python-2.7.13到ARM(aarch32)平台
  9. dos插入mysql乱码
  10. spark数据本地性级别划分