628
阿裏雲
Android SDK手冊__SDK手冊_HTTPDNS-阿裏雲
HTTPDNS Android SDK開發指南
1. 前言
本文檔介紹了HTTPDNS Android SDK的使用方式。
HTTPDNS是阿裏雲麵向移動開發者提供的移動端DNS解析服務。通過該SDK,開發者可以在自己的Android APP中獲得可靠、實時、精準的DNS解析服務,徹底解決傳統DNS麵臨的域名劫持、解析時延長、調度不精準等問題。
您可以通過獲取alicloud-android-demo工程源碼獲得HTTPDNS服務的使用例程。
您有兩種獲取SDK的方式:
- 您可以通過上述github demo獲取HTTPDNS SDK
- 您可以通過訪問移動服務APP列表頁(https://ams.console.aliyun.com/#/appList 若您第一次訪問,請創建APP),點擊下圖紅框中的下載OneSDK,進入OneSDK下載頁並勾選HTTPDNS組件獲取SDK
2. 應用程序初始化
2.1 獲取服務實例
HTTPDNS Android SDK以全局service實例的方式提供域名解析服務,您可以通過以下方式獲取實例:
HttpDnsService httpdns = HttpDns.getService(applicationContext, accountID);
// 參數applicationContext是您Android App的Context
// 參數accountID是係統分配的Account ID,當您開通HTTPDNS後,您可以在控製台獲取到您對應的Account ID信息
2.2 設置預解析域名
在您初始化程序時,可以選擇性地預先向HTTPDNS SDK中注冊您後續可能會使用到的域名,以便SDK提前解析,減少後續解析域名時請求的時延。您隻需調用以下接口:
ArrayList<String> hostList = new ArrayList<>(Arrays.asList("www.taobao.com", "www.aliyun.com"));
httpdns.setPreResolveHosts(hostList);
3. 服務API與使用示例
3.1 服務API
/**
* 獲取HTTPDNS服務實例
*
* @param applicationContext 您的Android App Context
* @param accountId 您的HTTPDNS租戶ID
*/
HttpDnsService getService(Context applicationContext, String accountID);
/**
* 將app使用到的域名預設進來,以便於HTTPDNS 進行預解析
*
* @param hostList 預解析列表
*/
void setPreResolveHosts(ArrayList<String> hostList);
/**
* 同步解析接口,首先查詢緩存,若存在則返回結果,若不存在則進行同步域名解析請求,解析完成返回最新解析結果,若解析失敗返回null
*
* @param host 域名(如www.aliyun.com)
* @return 域名對應的解析結果
*/
String getIpByHost(String host);
/**
* 異步解析接口,首先查詢緩存,若存在則返回結果,若不存在返回null並且進行異步域名解析更新緩存
*
* @param host 域名(如www.aliyun.com)
* @return 域名對應的解析結果
*/
String getIpByHostAsync(String host);
/**
* 同步解析接口, 獲取ip列表,首先查詢緩存,若存在則返回結果,若不存在則進行同步域名解析請求,解析完成返回最新解析結果,若解析失敗返回長度為0 的String 數組
*
* @param host
* @return 域名對應的解析結果列表
*/
String[] getIpsByHost(String host);
/**
* 異步解析接口, 獲取ip列表,首先查詢緩存,若存在則返回結果,若不存在返回長度為0 的String 數組並且進行異步域名解析更新緩存
*
* @param host
* @return 域名對應的解析結果列表
*/
String[] getIpsByHostAsync(String host);
/**
* 設置網絡切換時是否自動刷新所有域名解析結果,如果打開此開關,在網絡切換時,會自動刷新所有域名的解析結果,但會產生一定流量消耗
*
* @param enable
*/
void setPreResolveAfterNetworkChanged(boolean enable);
/**
* 設置降級策略,用戶可定製規則降級為原生DNS解析方式
*
* @param filter 降級代理
*/
void setDegradationFilter(DegradationFilter filter);
public interface DegradationFilter {
/**
* 降級過濾器
*
* @param hostName 當前的目標域名(如www.aliyun.com),您可以針對域名進行降級過濾
* @return 是否降級走原生DNS邏輯
*/
boolean shouldDegradeHttpDNS(String hostName);
}
/**
* 是否允許HTTPDNS返回TTL過期的域名
* 當您允許返回TTL過期的IP時,SDK在實時返回過期IP的同時依然會進行異步更新以獲取最新的IP信息
*
* @param enable 是否返回TTL過期域名
*/
void setExpiredIPEnabled(boolean enable);
/**
* 是否允許HTTPDNS打印Log
*
* @param shouldPrintLog 是否打印Log
*/
void setLogEnabled(boolean shouldPrintLog);
3.2 使用示例
您可以通過獲取alicloud-android-demo工程源碼獲得HTTPDNS服務的使用例程。
4. 注意事項
4.1 HTTP請求頭HOST字段設置
標準的HTTP協議中服務端會將HTTP請求頭HOST字段的值作為請求的域名信息進行解析。使用HTTPDNS後,您可能需要將HTTP請求URL中的HOST字段替換為HTTPDNS解析獲得的IP,這時標準的網絡庫會將您的IP賦值給HTTP請求頭的HOST字段,進而導致服務端的解析異常(服務端認可的是您的域名信息,而非IP信息)。為了解決這個問題,您可以主動設置HTTP請求HOST字段的值,如:
String originalUrl = "https://www.aliyun.com/";
URL url = new URL(originalURL);
String originalHost = url.getHost();
// 同步接口獲取IP
String ip = httpdns.getIpByHost(originalHost);
HttpURLConnection conn;
if (ip != null) {
// 通過HTTPDNS獲取IP成功,進行URL替換和HOST頭設置
url = new URL(originalUrl.replaceFirst(originalHost, ip));
conn = (HttpURLConnection) url.openConnection();
// 設置請求HOST字段
conn.setRequestProperty("Host", originHost);
} else {
conn = (HttpURLConnection) url.openConnection();
}
4.2 COOKIE字段
部分網絡庫支持COOKIE的自動存儲管理,當您使用HTTPDNS進行IP URL請求時,部分網絡庫會將您URL中的IP信息作為COOKIE對應的域名信息進行存儲管理(而非HTTP請求頭HOST字段信息),進而造成COOKIE管理與使用上的困擾,因此您需要關閉COOKIE的自動管理功能(默認關閉)。
4.3 HTTPS/WebView/SNI場景
- HTTPS場景,參考最佳實踐-HTTPS場景,Android HTTPS Demo;
- WebView場景,參考最佳實踐-WebView場景,Android WebView Demo;
- SNI(單IP多HTTPS域名)場景,參考最佳實踐-SNI場景,Android SNI Demo。
4.4 代理情況下的使用
當存在中間HTTP代理時,客戶端發起的請求中請求行會使用絕對路徑的URL,在您開啟HTTPDNS並采用IP URL進行訪問時,中間代理將識別您的IP信息並將其作為真實訪問的HOST信息傳遞給目標服務器,這時目標服務器將無法處理這類無真實HOST信息的HTTP請求。移動網關提供了X-Online-Host
的私有協議字段來解決這個問題,比如:
目標URL:https://www.aliyun.com/product/oss/
代理:10.0.0.172:80
您的HTTP請求頭應設置為:
GET https://10.0.0.172:80/product/oss/ HTTP/1.1
Host: 10.0.0.172
X-Online-Host: www.aliyun.com
同樣您可以通過setRequestProperty
方法進行X-Online-Host
請求頭域的設置,並在服務端設置對該私有頭域的解析。
在絕大多數場景下,我們建議您在代理模式下關閉HTTPDNS功能。
5. 混淆配置
-keep class com.alibaba.sdk.android.**{*;}
-keep class com.ut.**{*;}
-keep class com.ta.**{*;}
最後更新:2016-12-17 22:20:57
上一篇:
API接口__SDK手冊_HTTPDNS-阿裏雲
下一篇:
iOS SDK手冊__SDK手冊_HTTPDNS-阿裏雲
Subscription__基本概念_API使用手冊_消息服務-阿裏雲
EDAS 簡介__產品簡介_企業級分布式應用服務 EDAS-阿裏雲
集群擴容__集群API列表_API參考_容器服務-阿裏雲
加入、移出安全組__實例_用戶指南_雲服務器 ECS-阿裏雲
強製幹預__使用須知_用戶指南_彈性伸縮-阿裏雲
SSL 方式接入示例__Java 接入示例_MQTT 接入(物聯)_消息隊列 MQ-阿裏雲
獲取圖片主色調__獲取圖片信息_圖片處理指南_對象存儲 OSS-阿裏雲
資源__基本概念_基本介紹_大數據計算服務-阿裏雲
大於短信推送__短信推送_開發人員指南_消息服務-阿裏雲
專題&關鍵詞配置__輿情分析_快速開始_公眾趨勢分析-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲