在前面3篇文章中,咱們對RxHttp作了總體的介紹,並帶領你們自定義Parser及Param,若是還沒閱讀,請查看php
若是還未閱讀前面文章,請查看java
RxHttp 一條鏈發送請求,新一代Http請求神器(一)git
RxHttp 一條鏈發送請求之強大的數據解析功能(二)github
RxHttp 一條鏈發送請求之強大的Param類(三)post
RxHttp庫已更新至1.0.4版本,詳情請查看RxHttp 源碼ui
這篇文章將介紹如何使用註解自定義APIthis
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
現實開發中,大部人開發者都會將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。
而後,若是咱們不想使用默認的域名呢?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!!
先來看看源碼
@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
的源碼
@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
轉載請註明出處,謝謝🙏。