【一起學習Android開源框架】Retrofit的簡單使用(第一部分)

語言: CN / TW / HK

highlight: a11y-dark theme: awesome-green


前言

Retrofit是Square公司開發的一款HTTP框架,主要用於Android和Java;Retrofit會把所有http網路請求API變成java的介面,使用起來簡潔方便,下面我們一起開始學習Retrofit的使用流程和原理以及相關原始碼分析;

Retrofit簡介

Retrofit又稱為Restful Http網路請求框架的封裝,值得注意的是,它僅僅是對網路請求框架的封裝,可以說本身並不是一個框架,工作也不是本身來做的,現在Retrofit2底層是基於Okhttp來實現的,所以本職工作還是由它的核心Okhttp來完成

可以看下這張解析的流程圖

retrofitStart.png

  • 我們的應用程式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的使用.

官網給出的例子

  1. 第一步定義一個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地址的預設值

  1. 建立我們Retfrofit請求

kotlin val retrofit = Retrofit.Builder() .baseUrl("https://api.github.com/") .addConverterFactory(GsonConverterFactory.create()) .build() val service = retrofit.create(GithubService::class.java) - 使用構建者模式,然後我們傳入一個baseurl基礎路徑 - 呼叫addConvertFactory方法,基本作用就是將我們返回的httpResponse轉換成java物件,用於渲染在ui上面,這個在後面原始碼會繼續分析 - 呼叫build()方法完成retrofit配置 - 通過retrofit呼叫create方法建立GtihubService的例項,傳入它的位元組碼

  1. 呼叫介面中的方法,通過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")
        }
    
    })
    

    ```

  2. 從這裡可以看出了,retrofit真正的網路請求工作還是交給Okhttp去做的,上面使用的是enqueue()非同步請求,關於同步和非同步後面會詳細解析

自己使用的簡單例子

這裡我大致把retrofit網路請求過程分成了6個步驟

  1. 第一個步驟,新增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'

  2. 第二個步驟,建立實體類用於接收伺服器返回的Bean型別 java class MyResponse( name: String, age: Int, color: String, address: String )

  3. 第三個步驟,建立一個用於描述網路請求的介面 ```java interface MyInterface{ @GET(".../...") fun getCall():Call>

} ``` - retrofit將每一個http請求抽象成了java介面,採用註解模式描述和配置整個網路請求 - retrofit的註解內部機制是通過動態代理模式(這裡不詳細解析了)將整個註解翻譯成了一個個http請求

  1. 第四個步驟,開始建立retrofit,新增相關配置 java val retrofit = Retrofit.Builder() .baseUrl("http://xxx.xxx.com/") //設定網路請求的url地址 .addConverterFactory(GsonConverterFactory.create()) //設定資料解析器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //支援Rxjava平臺 .build()
  2. 這裡我們增加了兩個引數,先來看ConvertFactory,其實就是資料解析器,retrofit不僅僅支援Gson,類似json,protobuf都支援,所以這裡新增轉換器的工廠,值得注意的是,每次使用不同的資料解析,都需要在gradle新增相應的依賴
  3. 同時,retrofit也支援多種網路請求適配方式,如果使用的是Android預設的CallAdapter,就不需要新增網路請求介面卡的依賴

  4. 第五個步驟,建立網路請求介面的例項 java val myInterface = retrofit.create(MyInterface::class.java) val call = myInterface.getCall()

  5. retrofit呼叫create方法建立MyInterface的例項,傳入介面的位元組碼檔案
  6. 建立好之後,呼叫介面中的getCall()方法獲取Call的例項(Okhttp中的實際請求)

  7. 第六個步驟,進行實際的網路請求(呼叫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的內部機制是如何實現的

未完待續