1. 程式人生 > >Retrofit和RxJava講解

Retrofit和RxJava講解

一、什麼是Retrofit?

Retrofit,官方對他的描述是“一個型別安全的Android和java網路請求的客戶端”,其實就是一個封裝好的網路請求庫。首先,在網上找一個API介面用於測試:https://api.douban.com/v2/book/search?q=金瓶梅&tag=&start=0&count=1 這是一個用於查詢一本書詳細資訊的請求介面。如果直接用瀏覽器開啟會返回yixianei:

接下來,讓我們看看如何用Retrofit將上面的資料請求下來。當然了,為了在Android studio中新增Retrofit庫,我們還需要新增一下依賴:compile 'com.squareup.retrofit2:retrofit:2.1.0'

OK,新增完該庫,我們再來看看到底如何使用。

首先,我們建立一個實體類(Book),用於存放網路資料請求後返回的資料。這裡順帶說一句,有的人建立一個實體類時可能會根據瀏覽器中返回的資料去一行一行的敲,這樣難道你們不嫌麻煩嗎?在這裡教大家一個簡單快捷的方法,瞬間生成一個實體類。有的人會說了“哎呀,我用過”。沒錯,就是GsonFormat。它的使用很簡單,首先我們要在Android studio中下載這個外掛,點選左上角的File,然後點選Settings,在視窗中選擇Plugins,然後點選下面的Browse repositories...(上張圖給你們)

 

然後在新開啟的窗口裡面搜尋GsonFormat,再點選Install plugin就可以下載安裝啦,安裝完成後需要重啟studio,就可以用了。

它的用法很簡單,就比如我們建的Book實體類,在類裡面按Alt+insert,會彈出一個視窗,選擇GsonFormat,然後在彈出的編輯框裡面拷入在瀏覽器中請求下來的資料,然後一直點選OK它就會自動生成欄位,以及set和get方法,一會我們用Retrofit請求下來的資料都會儲存在這個實體類中,還是挺方便的。最後,再新增一個toString()方法,為了後面顯示方便。

好了,回到正題,實體類已經建好了,我們來看看這個Retrofit如何進行網路請求,其實程式碼也很簡單,首先 我們需要定義一個介面,取名為:RetrofitService:

看到這兒,想必有人要問了,這是什麼玩意兒,跟平時用的介面類很像,但又不一樣啊。彆著急,我來一一解釋一下,和比的介面類一樣,我們在其中定義了一個方法

getSearchBook,那麼這個方法是幹什麼的呢?其實很簡單,它就是拼接一個URL然後進行網路請求,這裡我們拼接的URL是上文中提到的測試URL,以你的智商你一定看出來了,這個URL中的book/search就是GET後的值,而“?”後面的q、tag、start、count等入參就是這個方法的入參。有的朋友要問了,https://api.douban.com/v2/ 這麼大一串跑哪兒去了?其實我們在進行網路請求的時候,在URL中前一部分是相對不變的。什麼意思呢?比如你開啟簡書網站,在簡書中你開啟不同的網頁,雖然他的URL會不同,但是你會發現,每個URL前面都是以https://api.douban.com/v2/ 開頭,我們把這個不變的部分,也叫做baseUrl提出來,放到另一個地方,下面我們會提到這個問題。這樣我們一個完整的URL就拼接好了。在方法的開頭我們可以看到有個GET的註釋,說明這個請求是GET方法的,當然你也可以根據需要用POST、PUT、DELETE以及HEAD。他們的區別如下

  • GET  ----------  查詢資源(查)
  • POST  --------  修改資源(改)
  • PUT  ----------  上傳檔案(曾)
  • DELETE  ----  刪除檔案(刪)
  • HEAD --------- 只請求頁面的首部

然後我們來看一下這個方法的返回值,它返回Call實體,一會我們要用它進行具體的網路請求,我們需要為它指定泛型為Book也就是我們資料的實體類。接下來,你會發現這個方法的入參和我們平時方法的入參還不大一樣。在每個入參前還多了一個註解。比如第一個入參@Query("q") String name Query 表示把你傳入的欄位拼接起來,比如在測試URL中我們可以看到q=金瓶梅的入參,那麼Query後面的值必須是q,要和URL中保持不變,然後我們定義了String型別的name,當呼叫這個方法時,用於傳入字串,比如可以傳入“金瓶梅”。那麼這個方法就會自動在q後面拼上這個字串進行網路請求。以此類推,這個url需要幾個入參你就在這個方法中定義幾個入參,沒個入參前面都要加上Query 註解。當飯Retrofit除了Query 這個註解外,還有幾個其他的,比如:@QueryMap,@Path,@Body,@FormUrlEncoded/Field,@Header,@Headers。我們來看一下他們的區別

@Query(GET請求):

用於在URL後拼接上引數

相當於:

@QueryMap(GET請求):

當然如果引數比較多,就可以把它們都放在Map中

@Path(GET請求):

用於替換url中某個欄位

像這種請求介面,在group和user之間有個不確定的id值需要傳入,就可以這種方法。我們把待定的值欄位用{}括起來,當然 {}裡的名字不一定就是id,可以任取,但需和@Path後括號裡的名字一樣。如果在user後面還需要傳入引數的話,就可以用Query拼接上

當我們呼叫這個方法時,假設我們groupId傳入1,sort傳入“2”,那麼它拼接成的url就是group/1/users?sort=2,當然最後請求的話還會加上前面的baseUrl。

@Body(POST請求):

可以指定一個物件作為HTTP請求體

它會把我們傳入的User實體類轉換為用於傳輸的HTTP請求體,進行網路請求。

@Field(POST請求):

用於傳送表單資料

注意開頭必須多加上@FormUrlEncoded這句註釋,不然會報錯。表單自然是有多組鍵值對組成,這裡的first_name就是鍵,而具體傳入的first就是值

@Header/@Headers(POST請求):

用於新增請求頭部

表示將頭部Authorization屬性設定為你傳入的authorization;當然你還可以用@Headers表示,作用是一樣的

當然你可以多個設定

好了,這樣我們就把上面這個RetrofitService 介面類解釋的差不多了。我覺得,Retrofit最主要的也就是這個介面類的定義了。好了,有了這個介面類,我們來看一下,到底如何使用這個我們定義的介面來進行網路請求。程式碼如下:

這裡我們可以看到,先新建了一個Retrofit物件,然後給它設定一個我們前面說的baseUrlhttps://api.douban.com/v2/.因為介面返回的資料不是我們需要的實體類,我們需要呼叫addConverterFactory方法進行轉換。由於返回的資料為json型別,所以在這個方法中傳入Gson轉換工廠GsonConverterFactory.create(new GsonBuilder().create()),這裡我們需要在studio中新增Gson的依賴:compile 'com.squareup.retrofit2:converter-gson:2.1.0'


然後我們呼叫retrofit的create方法並傳入上面我們定義的介面的檔名RetrofitService.class,就可以得到RetrofitService 的實體物件。有了這個物件,我們就可以呼叫裡面之前定義好的請求方法了

它會返回一個Call實體類,然後就可以呼叫Call的enqueue方法進行非同步請求,在enqueue方法中傳入一個回撥CallBack,重寫裡面的onResponse和
onFailure方法,也就是請求成功和失敗的回撥方法。當成功時,它會返回Response,裡邊封裝了請求結果的所有資訊,包括報頭,返回碼,還有主體等。比如呼叫它的body()方法就可獲得Book物件,也就是我們需要的資料。這裡我們就把返回的Book,顯示螢幕上。如下圖:

好了,到這裡我們就基本瞭解了Retrofit的整個工作流程。

​​​​​​​關於RxJava的講解,將會在下一章給大家呈現,敬請期待......