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