場景一:Api接口請求場景
選用阿里云HttpDns服務(wù)枢劝,利用HttpDns解析獲得ip后進(jìn)行ip直連的方法井联。
當(dāng)前項目中網(wǎng)絡(luò)數(shù)據(jù)請求框架采用Okhttp+Retrofit組合,OkHttp暴露了一個Dns接口您旁,通過自定義一個Dns解析器替換系統(tǒng)默認(rèn)Dns實現(xiàn)烙常。若獲取IP失敗則選用默認(rèn)Dns解析。
參考HttpDns+OkHttp最佳實踐鹤盒。
場景二:WebView業(yè)務(wù)場景
選用阿里云HttpDns服務(wù)蚕脏,主要實現(xiàn)方案同樣是IP直連。
1.對WebView加載的Url進(jìn)行攔截:WebView提供了setWebViewClient接口對網(wǎng)絡(luò)請求進(jìn)行攔截侦锯,通過重載WebViewClient中的shouldInterceptRequest方法驼鞭,我們可以攔截到所有的網(wǎng)絡(luò)請求。
2.將攔截到的請求域名替換成ip尺碰,添加原有頭部信息挣棕,設(shè)置Http請求頭Host域;
3.如果攔截到的請求是HTTPS請求亲桥,需要進(jìn)行證書校驗洛心,如果請求涉及到SNI場景,需要自定義SSLSocket题篷;
4.如果服務(wù)端返回重定向词身,此時需要判斷原有請求中是否含有cookie忙干;
5.根據(jù)攔截的頭信息獲取MIME類型以及編碼類型來判斷本次請求是否攔截虽风。
參考Android Webview + HttpDns最佳實踐。
注意事項
1.阿里云HttpDns服務(wù)提供預(yù)解析功能烂斋,可以將常用域名加入預(yù)解析列表中葫笼。
httpDnsService.setPreResolveHosts(new ArrayList<>(Arrays.asList("app.xxxx.com")));
2.WebView可用場景
前提條件:
- API Level >= 21
- GET請求
- 可以獲取到MIME類型以及編碼信息請求或是可以獲取到MIME類型的二進(jìn)制文件請求
可用場景:
- 普通HTTP請求
- HTTPS請求
- SNI請求
- HTTP報頭中不含cookie的重定向請求深啤。
3.不可用場景
- API Level < 21的設(shè)備
- POST請求
- 無法獲取到MIME類型的請求
- 無法獲取到編碼的非二進(jìn)制文件請求