【一起學習Android開源框架】Retrofit的簡單使用(第一部分)
highlight: a11y-dark theme: awesome-green
前言
Retrofit是Square公司開發的一款HTTP框架,主要用於Android和Java;Retrofit會把所有http網路請求API變成java的介面,使用起來簡潔方便,下面我們一起開始學習Retrofit的使用流程和原理以及相關原始碼分析;
Retrofit簡介
Retrofit又稱為Restful Http網路請求框架的封裝,值得注意的是,它僅僅是對網路請求框架的封裝,可以說本身並不是一個框架,工作也不是本身來做的,現在Retrofit2底層是基於Okhttp來實現的,所以本職工作還是由它的核心Okhttp來完成
可以看下這張解析的流程圖
- 我們的應用程式Application層,通過Retrofit層來封裝請求引數,url以及相關配置資訊
- 再通過Okhttp層來完成後續的請求操作
- 在服務端返回資料之後給Okhttp層,Okhttp層又會將原始結果交給Retrofit層,最後在通過Retrofit層返回給應用層,這就是解析的過程
簡單來說,讓Retrofit專注於介面封裝工作,讓Okhttp專注於網路請求高效操作,兩者分工合作,更能提高效率
簡單總結
- APP應用程式通過Retrofit請求網路,實際上是使用了Retrofit介面層封裝請求引數(頭部,url,請求訊息等等),之後由Okhttp完成後續的請求操作
- 在完成服務端返回資料之後,Okhttp將原始的結果交給Retrofit,Retrofit根據使用者的需求對結果進行解析
- 可以這麼說,它的主要作用就是封裝我們底層網路框架OkHttp,完成各種資料轉化和適配工作,而這些從而導致了Retrofit使用很多設計模式,意味著也有很好的擴充套件性,無縫適配那些主流的類似Okhttp,Rxjava庫等等
Retrofit簡單使用
看完上面的介紹,是不是感覺Retrofit非常強大,這也是現在很多專案都使用Retrofit的主要原因.下面我通過官方給出的例子結合自己給出的例子,來簡單聊聊Retrofit的使用.
官網給出的例子
-
第一步定義一個GithubService介面 ```java interface GithubService {
@GET("user/{user}/repos") fun listRepos(@Path("user") user: String): Call
- >
} ``` - 這裡的listRepos方法定義了一個Get註解,表示這個是一個Get請求,在Get註解中的字串寫入我們請求的路徑,這裡和後面的BaseUrl拼接起來就是一個完整的url - 然後在字串中有個{user},這裡的值是動態變化的,是由listRepos方法傳遞過來的 - 我們看下方法裡引數里加了個註解@Path,如果我們傳遞過來的字串user為空的話,就預設使用path中的字串來作為url地址的預設值
- 建立我們Retfrofit請求
kotlin
val retrofit = Retrofit.Builder()
.baseUrl("http://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val service = retrofit.create(GithubService::class.java)
- 使用構建者模式,然後我們傳入一個baseurl基礎路徑
- 呼叫addConvertFactory方法,基本作用就是將我們返回的httpResponse轉換成java物件,用於渲染在ui上面,這個在後面原始碼會繼續分析
- 呼叫build()方法完成retrofit配置
- 通過retrofit呼叫create方法建立GtihubService的例項,傳入它的位元組碼
-
呼叫介面中的方法,通過okhttp來執行網路請求 ```kotlin val repos: Call
- > = service.listRepos("octocat")
repos.enqueue(object : Callback<List<Repo>> { override fun onResponse(call: Call<List<Repo>>, response: Response<List<Repo>>) { TODO("Not yet implemented") } override fun onFailure(call: Call<List<Repo>>, t: Throwable) { TODO("Not yet implemented") } })
```
-
從這裡可以看出了,retrofit真正的網路請求工作還是交給Okhttp去做的,上面使用的是enqueue()非同步請求,關於同步和非同步後面會詳細解析
自己使用的簡單例子
這裡我大致把retrofit網路請求過程分成了6個步驟
-
第一個步驟,新增retrofit庫的依賴,增加網路許可權
gradle //retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' implementation 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
-
第二個步驟,建立實體類用於接收伺服器返回的Bean型別
java class MyResponse( name: String, age: Int, color: String, address: String )
-
第三個步驟,建立一個用於描述網路請求的介面 ```java interface MyInterface{ @GET(".../...") fun getCall():Call
- >
} ``` - retrofit將每一個http請求抽象成了java介面,採用註解模式描述和配置整個網路請求 - retrofit的註解內部機制是通過動態代理模式(這裡不詳細解析了)將整個註解翻譯成了一個個http請求
- 第四個步驟,開始建立retrofit,新增相關配置
java val retrofit = Retrofit.Builder() .baseUrl("http://xxx.xxx.com/") //設定網路請求的url地址 .addConverterFactory(GsonConverterFactory.create()) //設定資料解析器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //支援Rxjava平臺 .build()
- 這裡我們增加了兩個引數,先來看ConvertFactory,其實就是資料解析器,retrofit不僅僅支援Gson,類似json,protobuf都支援,所以這裡新增轉換器的工廠,值得注意的是,每次使用不同的資料解析,都需要在gradle新增相應的依賴
-
同時,retrofit也支援多種網路請求適配方式,如果使用的是Android預設的CallAdapter,就不需要新增網路請求介面卡的依賴
-
第五個步驟,建立網路請求介面的例項
java val myInterface = retrofit.create(MyInterface::class.java) val call = myInterface.getCall()
- retrofit呼叫create方法建立MyInterface的例項,傳入介面的位元組碼檔案
-
建立好之後,呼叫介面中的getCall()方法獲取Call的例項(Okhttp中的實際請求)
-
第六個步驟,進行實際的網路請求(呼叫enqueue進行非同步請求或者execute進行同步請求) ```java call.enqueue(object : Callback
- >{
override fun onResponse(
call: Call
- >,
response: Response
- >
) {
println(response.body())
}
override fun onFailure(call: Call<List<MyResponse>>, t: Throwable) { println("請求失敗") } })
```
以上就是一個完整的Retrofit請求
總結
綜合來說,我們已經瞭解Retrofit的簡單使用,大致如下: - 新增Retrofit庫的依賴,新增網路許可權 - 建立接收伺服器返回資料的類 - 建立用於描述網路請求的介面 - 建立Retroifit例項(建造者模式) - 建立網路請求介面例項 - 傳送網路請求(非同步/同步) - 處理伺服器返回的資料
這就是Retrofit簡單的使用流程,熟悉了以上這些,下面和同學我一起進入Retrofit的原始碼世界一探究竟吧,解析學習Retrofit的內部機制是如何實現的
未完待續
- 請收下這些Kotlin開發必知必會的編碼實踐方式
- 日常思考,目前Kotlin協程能完全取代Rxjava嗎
- 誇誇其談,簡單說說HTTP的優化歷程
- 【一起學習開源框架】Retrofit相對於OKHttp,解決了什麼問題
- Kotlin Sequences Api:入門
- 【日常小問題】談談Rxjava中的操作符以及幾種常見的Subject,應用到實際場景中
- 【一起學習Android開源框架】Retrofit原始碼解析-1(第四部分)
- 【日常小問題】解決BottomSheetDialogFragment中多個fragment滑動衝突
- 【一起學習Android開源框架】Retrofit註解解析(第三部分)
- 【一起學習Android開源框架】Retrofit使用的代理模式解析(第二部分)
- 【一起學習Android開源框架】Retrofit的簡單使用(第一部分)