1. 程式人生 > >Android 網路--我是怎麼做的: Volley+OkHttp+Https

Android 網路--我是怎麼做的: Volley+OkHttp+Https

使用 OkHttp 作為傳輸層的實現.

Volley 預設根據 Android 系統版本使用不同的 Http 傳輸協議實現.

在 Android 3.0 以上 Volley 使用 ApacheHttpStack 作為傳輸協議, 在2.3 及以下使用 HttpURLConnection 作為傳輸層協議

OkHttp 相較於其它的實現有以下的優點.

支援SPDY,允許連線同一主機的所有請求分享一個socket。 如果SPDY不可用,會使用連線池減少請求延遲。 使用GZIP壓縮下載內容,且壓縮操作對使用者是透明的。 利用響應快取來避免重複的網路請求。 當網路出現問題的時候,OKHttp會依然有效,它將從常見的連線問題當中恢復。 如果你的服務端有多個IP地址,當第一個地址連線失敗時,OKHttp會嘗試連線其他的地址,這對IPV4和IPV6以及寄宿在多個數據中心的服務而言,是非常有必要的。

因此使用 OkHttp 作為替代是好的選擇.

1.首先用 OkHttp 實現一個新的 HurlStack 用於構建 Volley 的 requestQueue.

2.然後使用 OkHttpStack 建立新的 Volley requestQueue.

這樣就行了.

使用 Https

作為一個有節操的開發者應該使用 Https 來保護使用者的資料, Android 開發者網站上文章Security with HTTPS and SSL做了詳盡的闡述.

OkHttp 自身是支援 Https 的. 參考文件 OkHttp Https, 直接使用上面的 OkHttpStack 就可以了, 但是如果遇到伺服器開發哥哥使用了自簽名的證書(不要問我為什麼要用自簽名的), 就無法正常訪問了.

網上有很多文章給出的方案是提供一個什麼事情都不做的TrustManager 跳過 SSL 的驗證, 這樣做很容受到攻擊, Https 也就形同虛設了.

我採用的方案是將自簽名的證書打包入 APK 加入信任.

好處:

應用難以逆向, 應用不再依賴系統的 trust store, 使得 Charles 抓包等工具失效. 要分析應用 API 必須反編譯 APK. 不用額外購買證書, 省錢....

缺點:

證書部署靈活性降低, 一旦變更證書必須升級程式.

實現步驟

以最著名的自簽名網站12306為例說明

1.匯出證書

將證書轉為 bks 格式

2.下載最新的bcprov-jdk, 執行下面的命令. storepass 是匯出金鑰檔案的密碼.

3.將匯出的 kyfw.bks 檔案放入 res/raw 資料夾下.

4.建立 SelfSignSslOkHttpStack

5.然後用 SelfSignSslOkHttpStack 建立 Volley 的 RequestQueue.

6.我們來試一試, 用上一步穿件的 RequestQueue 替換掉原來的, 然後發請求試試.

7.done