RxHttp 一條鏈發送請求之註解處理器 Generated API(四)

前言

在前面3篇文章中,咱們對RxHttp作了總體的介紹,並帶領你們自定義Parser及Param,若是還沒閱讀,請查看php

若是還未閱讀前面文章,請查看java

RxHttp 一條鏈發送請求,新一代Http請求神器(一)git

RxHttp 一條鏈發送請求之強大的數據解析功能(二)github

RxHttp 一條鏈發送請求之強大的Param類(三)post

RxHttp庫已更新至1.0.4版本,詳情請查看RxHttp 源碼ui

這篇文章將介紹如何使用註解自定義APIthis

Gradle 依賴

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

@DefaultDomain

現實開發中,大部人開發者都會將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。

@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")
        .asString()  
        .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下生成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

先來看看@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

轉載請註明出處,謝謝🙏。

相關文章
相關標籤/搜索