RxHttp 一条链发送请求之强大的Param类(三)
简介
前面我们对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
请求,同理postXxx
、putXxx
等方法就是对应的Post
、Put
等请求,而考虑到Post
等请求又可以有不同的形式,故提供了postForm
、postJson
方法,其中前者是表单形式,后者是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形式的请求生效,如:postJson
、putJson
、patchJson
、deleteJson
,此方法有两点需要注意:
- 非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);
}
复制代码
在上面的Headers
及Headers.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即可,需要特别说明的是getUrl
、getSimpleUrl
方法,其中前者会将参数以Get请求的形式拼接在url后面,并返回;而后者仅返回我们传入的url对象。(在RxHttp库内部,Get、Head请求会调用getUrl方法,其它请求皆调用getSimpleUrl方法)
自定义Param
从上面的结构图,我们可以看到,RxHttp内部提供了10个类,不同形式及方式的请求,然后,现实开发中,它并不能满足我们的业务场景,此时就需要我们自定义Param。看上图我们知道,所有Param的具体实现类,都间接继承与AbstractParam
类,而对于同一种请求,例如PostFormParam
、PostJsonParam
都继承于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类(三)相关推荐
- RxHttp 一条链发送请求之强大的数据解析功能(二)
前言 在上一文中,我们对RxHttp做了一个整体的介绍,文章一经发表后,就收到了广大读者众多不同的声音,有对我的肯定,也有对RxHttp提出改进的建议,更有读者直接指出了我的不足,为此,我收获了很多, ...
- RxHttp 一条链发送请求之注解处理器 Generated API(四)
前言 在前面3篇文章中,我们对RxHttp做了整体的介绍,并带领大家自定义Parser及Param,如果还没阅读,请查看 如果还未阅读前面两篇文章,请查看 RxHttp 一条链发送请求,新一代Http ...
- RxHttp 一条链发送请求,新一代Http请求神器(一)
简介 RxHttp是基于OkHttp的二次封装,并于RxJava做到无缝衔接,一条链就能发送一个完整的请求.主要功能如下: 支持Get.Post.Put.Delete等任意请求方式,可自定义请求方式 ...
- [转]RxHttp 一条链发送请求,新一代Http请求神器(一)
简介 RxHttp是基于OkHttp的二次封装,并于RxJava做到无缝衔接,一条链就能发送一个完整的请求.主要功能如下: 支持Get.Post.Put.Delete等任意请求方式,可自定义请求方式 ...
- RxHttp-一条链发送请求之强大的数据解析功能(二),kotlin构造器
}, throwable -> { //失败回调 }); 可以看到,直接使用fromListParser操作符,传入Student.class即可,它内部就是通过ListParser.get(S ...
- 二、scrapy爬虫框架——scrapy构造并发送请求
scrapy数据建模与请求 学习目标: 应用 在scrapy项目中进行建模 应用 构造Request对象,并发送请求 应用 利用meta参数在不同的解析函数中传递数据 1. 数据建模 通常在做项目的过 ...
- java后台获取流_java后台发送请求获取数据,并解析json数据
packagecom.bs.utils;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.io.Print ...
- python一张纸折叠到珠峰高度_python实现seo疯狂外链发送工具
网站外链发送工具 进来无事,抽空用python实现seo疯狂发送外链的工具.外链对网站优化来说是一个加分项,外链越多.质量越高这么对网站优化也越有利.通常网上有很多外链发送工具,其实是对各大网站平台插 ...
- php CURL 发送请求详解
cURL可以使用URL的语法模拟浏览器来传输数据,因为它是模拟浏览器,因此它同样支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 ...
最新文章
- QCustomPlot使用手冊(三)
- 深入浅出Spring Security(一):三句话解释框架原理
- 教你如何保养iphone电池
- 小米一键上锁工具_小米新品人脸识别智能锁:3D识别加红外,开门只需看一眼...
- 编程语言基础 c语言同步教案,C语言程序设计基实验教案.doc
- android跨进程关闭服务器,Android IPC机制(五)用Socket实现跨进程聊天程序
- Python3+Selenium3+Unittest+ddt+Requests 接口自动化测试框架
- DB2sql关键字——ALTER TABLE ....ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE
- Axure 汉化教程
- win10 安装sqlserver2000
- 小程序对接腾讯云IM即时聊天
- MySQL Order By 使用方法
- 根据IP统计网站访问次数
- translate()方法
- python去除视频马赛克_python使用opencv实现马赛克效果示例
- 关于生成树的一些小东西
- java星星图案总结
- [Eclipse]GEF入门系列(三、应用实例)
- js中的escape方法有什么用?
- 什么是对象,如何面向对象,为什么要面向对象
热门文章
- C语言-查找顺序表中的最大值
- python 解方程 sympy_Python数据处理篇之Sympy系列(五)---解方程
- php打包mysql_PHP封装MySQL的单例
- js面向对象2--原型
- Nikitosh 和异或 —— 一道 trie 树的题用可持久化 trie 水 然后翻车了...
- Python自定义分页组件
- [bzoj4881][Lydsy2017年5月月赛]线段游戏
- 交叉编译Python-2.7.13到ARM(aarch32)平台
- dos插入mysql乱码
- spark数据本地性级别划分