閱讀628 返回首頁    go 阿裏雲


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組件獲取SDK1ams2

2. 應用程序初始化

2.1 獲取服務實例

HTTPDNS Android SDK以全局service實例的方式提供域名解析服務,您可以通過以下方式獲取實例:

  1. HttpDnsService httpdns = HttpDns.getService(applicationContext, accountID);
  2. // 參數applicationContext是您Android App的Context
  3. // 參數accountID是係統分配的Account ID,當您開通HTTPDNS後,您可以在控製台獲取到您對應的Account ID信息

2.2 設置預解析域名

在您初始化程序時,可以選擇性地預先向HTTPDNS SDK中注冊您後續可能會使用到的域名,以便SDK提前解析,減少後續解析域名時請求的時延。您隻需調用以下接口:

  1. ArrayList<String> hostList = new ArrayList<>(Arrays.asList("www.taobao.com", "www.aliyun.com"));
  2. httpdns.setPreResolveHosts(hostList);

3. 服務API與使用示例

3.1 服務API

  1. /**
  2. * 獲取HTTPDNS服務實例
  3. *
  4. * @param applicationContext 您的Android App Context
  5. * @param accountId 您的HTTPDNS租戶ID
  6. */
  7. HttpDnsService getService(Context applicationContext, String accountID);
  8. /**
  9. * 將app使用到的域名預設進來,以便於HTTPDNS 進行預解析
  10. *
  11. * @param hostList 預解析列表
  12. */
  13. void setPreResolveHosts(ArrayList<String> hostList);
  14. /**
  15. * 同步解析接口,首先查詢緩存,若存在則返回結果,若不存在則進行同步域名解析請求,解析完成返回最新解析結果,若解析失敗返回null
  16. *
  17. * @param host 域名(如www.aliyun.com)
  18. * @return 域名對應的解析結果
  19. */
  20. String getIpByHost(String host);
  21. /**
  22. * 異步解析接口,首先查詢緩存,若存在則返回結果,若不存在返回null並且進行異步域名解析更新緩存
  23. *
  24. * @param host 域名(如www.aliyun.com)
  25. * @return 域名對應的解析結果
  26. */
  27. String getIpByHostAsync(String host);
  28. /**
  29. * 同步解析接口, 獲取ip列表,首先查詢緩存,若存在則返回結果,若不存在則進行同步域名解析請求,解析完成返回最新解析結果,若解析失敗返回長度為0 的String 數組
  30. *
  31. * @param host
  32. * @return 域名對應的解析結果列表
  33. */
  34. String[] getIpsByHost(String host);
  35. /**
  36. * 異步解析接口, 獲取ip列表,首先查詢緩存,若存在則返回結果,若不存在返回長度為0 的String 數組並且進行異步域名解析更新緩存
  37. *
  38. * @param host
  39. * @return 域名對應的解析結果列表
  40. */
  41. String[] getIpsByHostAsync(String host);
  42. /**
  43. * 設置網絡切換時是否自動刷新所有域名解析結果,如果打開此開關,在網絡切換時,會自動刷新所有域名的解析結果,但會產生一定流量消耗
  44. *
  45. * @param enable
  46. */
  47. void setPreResolveAfterNetworkChanged(boolean enable);
  48. /**
  49. * 設置降級策略,用戶可定製規則降級為原生DNS解析方式
  50. *
  51. * @param filter 降級代理
  52. */
  53. void setDegradationFilter(DegradationFilter filter);
  54. public interface DegradationFilter {
  55. /**
  56. * 降級過濾器
  57. *
  58. * @param hostName 當前的目標域名(如www.aliyun.com),您可以針對域名進行降級過濾
  59. * @return 是否降級走原生DNS邏輯
  60. */
  61. boolean shouldDegradeHttpDNS(String hostName);
  62. }
  63. /**
  64. * 是否允許HTTPDNS返回TTL過期的域名
  65. * 當您允許返回TTL過期的IP時,SDK在實時返回過期IP的同時依然會進行異步更新以獲取最新的IP信息
  66. *
  67. * @param enable 是否返回TTL過期域名
  68. */
  69. void setExpiredIPEnabled(boolean enable);
  70. /**
  71. * 是否允許HTTPDNS打印Log
  72. *
  73. * @param shouldPrintLog 是否打印Log
  74. */
  75. 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字段的值,如:

  1. String originalUrl = "https://www.aliyun.com/";
  2. URL url = new URL(originalURL);
  3. String originalHost = url.getHost();
  4. // 同步接口獲取IP
  5. String ip = httpdns.getIpByHost(originalHost);
  6. HttpURLConnection conn;
  7. if (ip != null) {
  8. // 通過HTTPDNS獲取IP成功,進行URL替換和HOST頭設置
  9. url = new URL(originalUrl.replaceFirst(originalHost, ip));
  10. conn = (HttpURLConnection) url.openConnection();
  11. // 設置請求HOST字段
  12. conn.setRequestProperty("Host", originHost);
  13. } else {
  14. conn = (HttpURLConnection) url.openConnection();
  15. }

4.2 COOKIE字段

部分網絡庫支持COOKIE的自動存儲管理,當您使用HTTPDNS進行IP URL請求時,部分網絡庫會將您URL中的IP信息作為COOKIE對應的域名信息進行存儲管理(而非HTTP請求頭HOST字段信息),進而造成COOKIE管理與使用上的困擾,因此您需要關閉COOKIE的自動管理功能(默認關閉)。

4.3 HTTPS/WebView/SNI場景

4.4 代理情況下的使用

當存在中間HTTP代理時,客戶端發起的請求中請求行會使用絕對路徑的URL,在您開啟HTTPDNS並采用IP URL進行訪問時,中間代理將識別您的IP信息並將其作為真實訪問的HOST信息傳遞給目標服務器,這時目標服務器將無法處理這類無真實HOST信息的HTTP請求。移動網關提供了X-Online-Host的私有協議字段來解決這個問題,比如:

  1. 目標URL:https://www.aliyun.com/product/oss/
  2. 代理:10.0.0.172:80
  3. 您的HTTP請求頭應設置為:
  4. GET https://10.0.0.172:80/product/oss/ HTTP/1.1
  5. Host: 10.0.0.172
  6. X-Online-Host: www.aliyun.com

同樣您可以通過setRequestProperty方法進行X-Online-Host請求頭域的設置,並在服務端設置對該私有頭域的解析。

在絕大多數場景下,我們建議您在代理模式下關閉HTTPDNS功能。

5. 混淆配置

  1. -keep class com.alibaba.sdk.android.**{*;}
  2. -keep class com.ut.**{*;}
  3. -keep class com.ta.**{*;}

最後更新:2016-12-17 22:20:57

  上一篇:go API接口__SDK手冊_HTTPDNS-阿裏雲
  下一篇:go iOS SDK手冊__SDK手冊_HTTPDNS-阿裏雲