目錄:
一、前言
蒹葭(JianJia)是一款鴻蒙系統上的網絡請求框架,其實就是將安卓的Retrofit移植到鴻蒙系統上,我將鴻蒙版的Retrofit命名為蒹葭(JianJia)。蒹葭不僅能實現Retrofit的功能,還會提供一些Retrofit沒有的功能。Retrofit不支持動態替換域名,國內的應用一般都是有多個域名的,蒹葭支持動態替換域名。
二、源碼
- 熟悉okhttp的常見用法 ;
- 熟悉面向接口編程、反射、泛型、注解;
- 熟悉構造者模式、適配器模式、工廠模式、策略模式、靜態代理、動態代理、責任鏈模式等設計模式。
三、混淆
如果項目開啟了混淆,請在proguard-rules.pro
添加如下的代碼。關於混淆,可以查看鴻蒙代碼配置混淆
四、添加依賴
4、1 在項目根目錄下的build.gradle
文件中添加mavenCentral()
倉庫,打開項目根目錄下的build.gradle
文件,在build.gradle
文件的repositories
閉包下面添加mavenCentral()
4、2 打開entry
目錄下的build.gradle
文件中,在build.gradle
文件中的dependencies
閉包下添加下面的依賴
4、3 在配置文件中添加如下的權限
五、具體用法,用法跟retrofit一樣
蒹葭提供了一系列的注解,在進行網絡請求的時候,就需要用到這些注解。
5、1 GET注解
創建接口,在方法里面使用GET
注解,GET
注解用於標識這是一個GET
請求,方法的返回值是Call
對象,泛型是ResponseBody
,其實泛型也可以是具體的實體對象,這個后面再說。蒹葭如何完成網絡請求?使用構造者模式創建jianjia
對象,baseUrl
就是域名,在創建jianjia
對象的時候就必須指定域名。調用create
方法來生成接口的實例,調用wan.getBanner().enqueue
來執行網絡請求,請求成功就會回調onResponse
方法,請求失敗就會回調onFailure
方法。
5、2 BaseUrl注解
國內的應用一般都是有多個域名的,BaseUrl
注解可以對某個接口設置單獨的域名。
5、3 Path注解
Path
注解在路徑中替換指定的參數值,定義下面的方法。可以看到我們定義了一個getArticle
方法,方法接收一個page
參數,並且我們的@GET
注解中使用{page}
聲明了訪問路徑,這里你可以把{page}
當做占位符,而實際運行中會通過@Path("page")
所標注的參數進行替換。
5、4 Query注解
Query
注解用於給get
請求添加請求參數,被Query
注解修飾的參數類型可以是數組、集合、字符串等。
5、5 QueryMap注解
QueryMap
注解以map
的形式添加查詢參數,被QueryMap
注解修飾的參數類型必須是Map對象。
5、6 SkipCallbackExecutor注解
在鴻蒙系統上,蒹葭默認會將服務端的響應回調到主線程,如果在方法上使用SkipCallbackExecutor
注解,那就不會將服務端的結果回調到主線程。
5、7 FormUrlEncoded注解和Field注解
FormUrlEncoded
注解用於發送一個表單請求,使用該注解必須在方法的參數添加Field
注解,被Field
注解修飾的參數類型可以是數組、集合、字符串等。
5、8 FormUrlEncoded注解和FieldMap注解
有時候表單的參數會比較多,如果使用Field
注解,方法的參數就會比較多,此時就可以使用FieldMap
注解,FieldMap
注解以鍵值對的形式發送一個表單請求。如果被FieldMap
注解修飾的參數不是Map
類型,就會拋異常。如果Map
的鍵值對為空,也會拋異常。
5、9 Body注解
服務端會要求端上把json
字符串作為請求體發給服務端。此時就可以使用Body
注解定義的參數可以直接傳入一個實體類,內部會把該實體序列化並將序列化后的結果直接作為請求體發送出去。
如果被Body
注解修飾的參數的類型是RequestBody
對象,那調用者可以不添加數據轉換器,內部會使用默認的數據轉換器。
如果被Body
注解修飾的參數的類型不是RequestBody
對象,是一個具體的實體類,那調用者需要自定義一個類,並且繼承Converter.Factory
。
5、10 Url注解
Url
注解用於添加接口的完整地址。在Retrofit
里面,如果接口的域名與創建retrofit
對象指定的域名不相同,那就會使用Url
注解來解決問題。在蒹葭里面同樣可以使用Url
注解來解決問題,但蒹葭還提供了BaseUrl
來解決該問題。
5、11 Headers注解
Headers
注解是作用於方法上的注解,用於添加一個或多個請求頭。
5、12 Header注解
Header
注解是作用於參數上的注解,用於添加請求頭。
5、13 HeaderMap注解
HeaderMap
注解是作用於參數上的注解,以map
的形式添加請求頭,map
中每一項的鍵和值都不能為空,否則會拋異常。
5、14 添加數據轉換器
之前我們在接口里面定義方法的時候,方法的返回值時Call
對象,泛型是ResponseBody
。在這種情況下,服務端返回給端上的數據就會在ResponseBody
里面,端上需要手動解析json
,將json
解析成一個實體類。
其實,我們沒必要手動解析json
,可以讓gson
幫我們解析json
。蒹葭支持添加數據轉換器,在創建對象的時候添加數據轉換器,也就是把gson
添加進來。在onResponse
方法里面就可以直接得到實體類對象了,gson
幫我們把json
解析成了一個實體對象。
首先在build.gradle
文件添加數據轉換器的依賴。
在代碼中使用數據轉換器
六、總結
本文介紹了蒹葭的用法,蒹葭的原理跟retrofit是一樣的,有興趣的同學可以去看下源碼。
作者:裴雲飛1
想了解更多內容,請訪問51CTO和華為合作共建的鴻蒙社區:https://harmonyos.51cto.com