阅读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-阿里云