RxHttp 让你眼前一亮的Http请求框架( 十 )


  • postForm请求,需要将所有添加的参数,拼接在一起,随后加密,最后将加密的字符串添加到请求头中
  • postJson请求,需要将所有的参数,也就是json字符串加密后再发送出去
  • FormParam里面的API不够用,我要自定义API
5.2.1、postForm请求加密这种情况,我们需要继承FormParam,并重写getRequestBody()方法,如下:
@Param(methodName = "postEncryptForm")public class PostEncryptFormParam extends FormParam {public PostEncryptFormParam(String url) {super(url, Method.POST);//Method.POST代表post请求}@Overridepublic RequestBody getRequestBody() {//这里拿到你添加的所有参数List<KeyValuePair> keyValuePairs = getKeyValuePairs();String encryptStr = "加密后的字符串";//根据上面拿到的参数,自行实现加密逻辑addHeader("encryptStr", encryptStr);return super.getRequestBody();}}5.2.2、postJson请求加密这种情况,我们需要继承JsonParam,也重写getRequestBody()方法,如下:
@Param(methodName = "postEncryptJson")public class PostEncryptJsonParam extends JsonParam {public PostEncryptFormParam(String url) {super(url, Method.POST);}@Overridepublic RequestBody getRequestBody() {//这里拿到你添加的所有参数Map<String, Object> params = getParams();String encryptStr = "加密后的字符串";//根据上面拿到的参数,自行实现解密逻辑return RequestBody.create(MEDIA_TYPE_JSON, encryptStr);//发送加密后的字符串}}5.2.3、自定义API我们继承FormParam,并新增两个test方法`,如下:
@Param(methodName = "postTestForm")public class PostTestFormParam extends FormParam {public PostEncryptFormParam(String url) {super(url, Method.POST);}public PostEncryptFormParam test(long a, float b) {//这里的业务逻辑自行实现return this;}public PostEncryptFormParam test1(String s, double b) {//这里的业务逻辑自行实现return this;}}5.2.4、使用自定义的Param同样的问题,我们怎么用这3个自定义的Param呢?我想大多数人在类名前发现类@Param注解,并为Param取了别名 。那这个又有什么作用呢? 答案揭晓,只要在自定的Param上使用了@Param注解,并取了别名,就会在RxHttp类自动生成一个跟别名一样的方法,在上面我们自定义了3个Param,并分别取别名为postEncryptForm、postEncryptJson、postTestForm,此时就会在RxHttp类中生成postEncryptForm(String)、postEncryptJsonString)、postTestForm(String)这3个方法,我们在RxHttp这个类中来看下:
public static RxHttp$PostEncryptFormParam postEncryptForm(String url) {return new RxHttp$PostEncryptFormParam(new PostEncryptFormParam(url));}public static RxHttp$PostEncryptJsonParam postEncryptJson(String url) {return new RxHttp$PostEncryptJsonParam(new PostEncryptJsonParam(url));}public static RxHttp$PostTestFormParam postTestForm(String url) {return new RxHttp$PostTestFormParam(new PostTestFormParam(url));}发请求时,只需要调用对应的方法就好,如:
//发送加密的postForm请求RxHttp.postEncryptForm("/service/...").add("key", "value")//添加参数,可调用多次.asString()//返回String类型.subscribe(s-> {//请求成功}, throwable -> {//请求失败});//发送加密的postJson请求RxHttp.postEncryptJson("/service/...").add("key", "value")//添加参数,可调用多次.asString()//返回String类型.subscribe(s-> {//请求成功}, throwable -> {//请求失败});那我自定义的API如何调用呢,so easy!!!!,选择对应的请求方法后,就可以直接调用,如下:
//发送加密的postJson请求RxHttp.postTestJson("/service/...").test(100L, 99.99F)//调用自定义的API.test1("testKey", 88.88D)//调用自定义的API.add("key", "value")//添加参数,可调用多次.asString()//返回String类型.subscribe(s-> {//请求成功}, throwable -> {//请求失败});5.3、自定义ConverterRxHttp内部默认使用来GsonConverter,并且额外提供了4个Converter,如下:
//非必须 根据自己需求选择ConverterRxHttp默认内置了GsonConverterimplementation 'com.rxjava.rxhttp:converter-jackson:1.3.6'implementation 'com.rxjava.rxhttp:converter-fastjson:1.3.6'implementation 'com.rxjava.rxhttp:converter-protobuf:1.3.6'implementation 'com.rxjava.rxhttp:converter-simplexml:1.3.6'5.3.1、自定义TestConverter即使这样,RxHttp也无法保证满足所有的业务需求,为此,我们可以选择自定义Converter,自定义Converter需要继承IConverter接口,如下:
public class TestConverter implements IConverter {/*** 请求成功后会被回调* @param bodyResponseBody* @param type泛型类型* @param onResultDecoder是否需要对结果进行解码/解密*/@Overridepublic <T> T convert(ResponseBody body, Type type, boolean onResultDecoder) throws IOException {//自行实现相关逻辑return null;}/*** json请求前会被回调,需要自行根据泛型T创建RequestBody对象,并返回*/@Overridepublic <T> RequestBody convert(T value) throws IOException {//自行实现相关逻辑return null;}}


推荐阅读