寫在前面
現在,Android應用程式中整合第三方API已十分流行。應用程式都有自己的網路操作和快取處理機制,但是大部分比較脆弱,沒有針對網路糟糕情況進行優化。感謝Square lnc 這家有創新精神的公司,將信用卡商業交易帶到手機上。現在有了一系列高質量開源庫,支援在Android應用程式中整合。
做什麼,如何做?
現在,我們要依次學習使用Retrofit、OKHttp和GSON,簡單快速的整合REST API。使用這個組合,我們需要從Twitch.tv下載並解析一些資料。跟著下面的步驟可以在幾分鐘內,不用寫繁瑣的模板程式碼,完成大部分的REST API整合。
學習
Retrofit
Retrofit簡化了從Web API下載資料,解析成普通的Java物件(POJO)。例如,要從Github 上下載使用者倉庫的資訊,你只需要編寫下面的幾行:
1 2 3 |
; html-script: false ] @GET("/users/{user}/repos") List listRepos(@Path("user") String user); |
另外,你需要建立倉庫資訊類和資料型別。這些程式碼也可以自動生成,下面會介紹如何自動生成。
整個過程很簡單,類似傳送一次有引數的請求或傳送POST或HEAD。如何連線不同型別的API,請檢視說明文當。
Retrofit的特性之一可以將處理邏輯新增到請求和響應中。你可以新增資料到http請求頭部,也可以攔截驗證失敗的響應重定向到登入介面。
OKHttp
OKHttp是Android版Http客戶端。非常高效,支援SPDY、連線池、GZIP和 HTTP 快取。預設情況下,OKHttp會自動處理常見的網路問題,像二次連線、SSL的握手問題。如果你的應用程式中整合了OKHttp,Retrofit預設會使用OKHttp處理其他網路層請求。
GSON
GSON是將JSON解析成POJO的Java庫。GSON也可以將POJO解析成JSON。在Android中,資料物件儲存在SharePreference更加方便。
要使用GSON,首先需要建立相應的POJO資料,再用GSON解析為POJO物件。解析過程簡單且非常高效。需要了解如何建立可以被GSON解析的POJO物件,請檢視說明文件。Retrofit使用GSON解析JSON資料。
開始Coding
新增庫檔案到工程
查詢或者編寫API
你可能已有一份API,如果你還在尋找API目錄,我推薦ProgrammableWeb。在這個教程中,我們會解析Twitch.Tv的資料流。請求格式請參考說明手冊。Twicht.tv請求資料流的JSON格式:
http://api.justin.tv/api/stream/list.json
展示輸出
展示一些API返回的資料,下面的示例是由於是一個GET請求,只能在瀏覽器中執行,返回資料如下:
1 2 |
; html-script: false ] [{"broadcast_part": 4, "featured": true, "channel_subscription": true, "audio_codec": "uncompressed", "id": "6640712464", "category": "gaming", "title": "Fnatic xPeke, Normals(ranked down) on smurf", "geo": "DE", "video_height": 1080, "site_count": 8014, "embed_enabled": true, "channel": {"subcategory": null, "producer": true, "image_url_huge": "http://static-cdn.jtvnw.net/jtv_user_pictures/xpeke-profile_image-a182a5fe5a8f239b-600x600.jpeg", "timezone": "Europe/Madrid", "screen_cap_url_huge": “http://static |
建立POJO
這部分很有趣,用我們獲取到的資料自動建立對應的POJO。使用jsonschema2pojo,匯入包名、類名和JSON資料,儲存為私有型別。示例中展示的構造器無法使用,因為JSON資料的根元素是個陣列,不是物件。所以我只貼出了陣列的第一個元素。展示相關的圖片示例。
整合POJOs
將自動產生的POJOs貼上到工程中就可以了。在我的示例工程中,他們在models包中。
使用Retrofit下載(解析)API
建立REST Adapter
建立Adapter,類似設定endPoint。
1 2 3 4 |
; html-script: false ] RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("http://api.justin.tv/api") .build(); |
定義API介面
為需要連線的endPoint定義介面。下面示例中,使用limit和offset,這兩個引數用來控制請求資料位置和大小。詳細說明請參考API文件。
1 2 3 4 |
; html-script: false ] public interface TwitchTvApiInterface { @GET("/stream/list.json") void getStreams(@Query("limit") int limit, @Query("offset") int offset, Callback<List> callback);} |
你可能會注意到,我們期望返回的是一組JustinTvStreamData物件,也就是我們剛才自動產生的POJO。關於如何定義這個介面的更多資訊,請參考Retrofit說明文件。
建立Twitch.tv 服務
現在我們已經建立了endPoint,定義了需要的介面。下面需要建立Twitch.TV服務,傳送請求。
1 2 |
; html-script: false ] TwitchTvApiInterface twitchTvService = restAdapter.create(TwitchTvApiInterface.class); |
使用API
傳送API請求十分簡單,只需要使用剛才建立的服務即可。
1 2 3 4 5 6 7 8 9 10 11 |
; html-script: false ] twitchTvService.getStreams(ITEMS_PER_PAGE, pageNumber * ITEMS_PER_PAGE, new Callback<List>() { @Override public void success(List justinTvStreamData, Response response) { consumeApiData(justinTvStreamData); } @Override public void failure(RetrofitError retrofitError) { consumeApiData(null); }}); |
這裡有一點需要注意,Retrofit會在後臺執行緒下載並解析API資料,根據結果不同(成功或失敗)傳送到UI執行緒。Retrofit也支援在後臺自動下載(這裡沒有顯示)。
資料處理趣事
現在我們用POJO資料做一些有趣的事情。在這個Demo中,展示了Twitch.Tv頻道的圖片和描述,使用Picasso Library 下載快取圖片。
參考程式碼
感覺有趣嗎?
你有發現這類工作很有趣嗎?你是否喜愛古樸的賓夕法尼亞雄鹿?你是一名出色的Android開發者嗎? 歡迎聯絡我們。