域名解析接口

前言

HTTPDNS SDK除了提供了丰富的域名解析的接口之外,还提供了相关的能力。包括:

设置预解析域名

App启动,完成SDK初始化后,可以立即调用此接口,设置您后续可能会使用到的热点域名,以便SDK提前解析,减少后续域名解析时请求的时延。

如果是在运行过程中调用,SDK也会立即解析设置的域名列表中的域名,从而刷新这些域名的解析结果,记录到缓存中。相当于强制做一次更新。通常用于某些业务动作发生之后,希望刷新当前的域名解析,强制域名重新调度。

重要

基于解析效率和响应速度的平衡考量,SDK每次向服务端提交的批量解析任务限制为5个域名。 因此当预解析列表的域名个数超过5个时,SDK会自动分批提交解析。

setPreResolveHosts

接口定义

void setPreResolveHosts(ArrayList<String> hostList)

void setPreResolveHosts(ArrayList<String> hostList, RequestIpType requestIpType)

引入版本

2.4.0

所属类

HttpDnsService

参数说明

参数

类型

是否必填

说明

hostList

ArrayList<String>

预解析域名列表。如果没有requestIpType参数则默认为RequestIpType.v4。

重要
  • 待解析的域名,必须为纯域名字符串,不可包含协议头(如http://)、路径或者端口,否则可能导致解析异常。

  • 不支持泛域名。

  • 正确示例:

     ArrayList<String>  hostList = new ArrayList<>();
     hostList.add("www.aliyun.com");
     hostList.add("www.taobao.com");          
  • 错误示例:

     ArrayList<String>  hostList = new ArrayList<>();
     hostList.add("https://www.aliyun.com");
     hostList.add("http://www.taobao.com/help"); 

requestIpType

RequestIpType

预解析的IP类型。推荐使用RequestIpType.both

枚举类型,代表解析哪种类型的IP:

  • v4:需要解析的类型为IPv4。

  • v6:需要解析的类型为IPv6。

  • both:需要解析的类型为IPv4IPv6。

  • auto:SDK内部根据设备当前的网络栈情况判断,默认解析IPv4地址,如果当前网络栈支持IPv6,也会尝试解析IPv6的地址。

同步解析域名

  • 使用同步解析接口解析域名,会阻塞当前线程,直到获得有效解析结果并返回。

  • 该接口首先查询缓存,若缓存存在可用的解析结果则立即返回缓存解析结果,若缓存中没有可用的解析结果,则会阻塞当前调用解析的线程并且在工作线程中进行域名解析,等域名解析完成返回解析结果,或达到超时时间返回空值。

  • 为了防止在主线程中误用本接口导致APP卡顿,本接口会做检测,若发现调用线程是主线程,则自动降级到getHttpDnsResultForHostSyncNonBlocking接口的实现逻辑。

重要

同步解析接口,整体的耗时受超时配置控制,如果在超时配置内还没有解析成功,会立即返回空解析结果。

getHttpDnsResultForHostSync

接口定义

HTTPDNSResult getHttpDnsResultForHostSync(String host, RequestIpType requestIpType)

引入版本

2.3.2

所属类

HttpDnsService

参数定义

参数

类型

是否必填

说明

host

String

待解析域名。

requestIpType

RequestIpType

待解析的IP类型。推荐使用RequestIpType.both

枚举类型,代表解析哪种类型的IP:

  • v4:需要解析的类型为IPv4。

  • v6:需要解析的类型为IPv6。

  • both:需要解析的类型为IPv4IPv6。

  • auto:SDK内部根据设备当前的网络栈情况判断,默认解析IPv4地址,如果当前网络栈支持IPv6,也会尝试解析IPv6的地址。

返回说明

类型

说明

HTTPDNSResult

解析结果。

代码示例

val httpdns = HttpDns.getService(accountID)
val httpDnsResult = dnsService?.getHttpDnsResultForHostSync("www.aliyun.com", RequestIpType.auto)
HttpDnsService httpdns = HttpDns.getService(accountID);
HTTPDNSResult httpDnsResult = httpdns.getHttpDnsResultForHostSync("www.aliyun.com", RequestIpType.auto);

异步解析域名

  • 使用异步解析接口解析域名,不会阻塞当前线程,解析结果会通过回调的形式返回。

  • 该接口首先查询缓存,若缓存存在可用的解析结果则立即通过回调返回缓存解析结果,若缓存中没有可用的解析结果,则会在工作线程中进行域名解析,等域名解析结束或者达到超时时间再通过回调返回解析结果。

重要

异步解析接口,整体的耗时受超时配置控制,如果在超时配置内还没有解析成功,会立即通过回调返回空解析结果。

getHttpDnsResultForHostAsync

接口定义

void getHttpDnsResultForHostAsync(String host, RequestIpType type, HttpDnsCallback callback)

引入版本

2.4.0

所属类

HttpDnsService

参数说明

参数

类型

是否必填

说明

host

String

待解析域名。

requestIpType

RequestIpType

待解析的IP类型。推荐使用RequestIpType.both

枚举类型,代表解析哪种类型的IP:

  • v4:需要解析的类型为IPv4。

  • v6:需要解析的类型为IPv6。

  • both:需要解析的类型为IPv4IPv6。

  • auto:SDK内部根据设备当前的网络栈情况判断,默认解析IPv4地址,如果当前网络栈支持IPv6,也会尝试解析IPv6的地址。

callback

HttpDnsCallback

域名解析结果回调接口。

代码示例

val httpdns = HttpDns.getService(accountID)
val httpDnsResult = dnsService?.getHttpDnsResultForHostAsync("www.aliyun.com", RequestIpType.auto, HttpDnsCallback {
                        httpDnsResult = it
                    })
HttpDnsService httpdns = HttpDns.getService(accountID);
HTTPDNSResult httpDnsResult = httpdns.getHttpDnsResultForHostAsync("www.aliyun.com", RequestIpType.auto, new HttpDnsCallback() {
                                void onHttpDnsCompleted(HTTPDNSResult result) {
                                }      
                              });

同步非阻塞解析域名

  • 使用同步非阻塞接口解析域名,不会阻塞当前线程,但可能会返回空结果。

  • 该接口仅查询缓存,返回缓存查询的解析结果。若缓存中没有解析结果或者缓存中的解析结果已经TTL过期,则会在工作线程中进行域名解析,解析成功后更新缓存,供下次调用域名解析使用。

getHttpDnsResultForHostSyncNonBlocking

接口定义

HTTPDNSResult getHttpDnsResultForHostSyncNonBlocking(String host, RequestIpType type)

引入版本

2.4.0

所属类

HttpDnsService

参数说明

参数

类型

是否必填

说明

host

String

待解析域名。

requestIpType

RequestIpType

待解析的IP类型。推荐使用RequestIpType.both

枚举类型,代表解析哪种类型的IP:

  • v4:需要解析的类型为IPv4。

  • v6:需要解析的类型为IPv6。

  • both:需要解析的类型为IPv4IPv6。

  • auto:SDK内部根据设备当前的网络栈情况判断,默认解析IPv4地址,如果当前网络栈支持IPv6,也会尝试解析IPv6的地址。

返回说明

类型

说明

HTTPDNSResult

解析结果。

代码示例

val httpdns = HttpDns.getService(accountID)
val httpDnsResult = dnsService?.getHttpDnsResultForHostSyncNonBlocking("www.aliyun.com", RequestIpType.auto)
HttpDnsService httpdns = HttpDns.getService(accountID);
HTTPDNSResult httpDnsResult = httpdns.getHttpDnsResultForHostSyncNonBlocking("www.aliyun.com", RequestIpType.auto);

清空指定域名缓存

使用阿里云域名解析服务的用户,调用该接口主动清除本地缓存,可实现秒级域名配置生效。 例如:假设域名xxx.com,解析IP地址为ip1, 当ip1遭受攻击,需要将流量迁移至ip2,实现流程如下:

  1. 首先,用户在云解析控制台将域名对应IP修改为ip2,此时在HTTPDNS服务端会立即获取到此变更信息,并清除服务端该域名的ip1缓存。

  2. 用户手动调用此接口,清空xxx.com域名的本地缓存。

  3. App端清空缓存后的下一次请求,会使得服务端重新请求权威服务器,获取最新解析IP地址ip2,从而使前端解析结果立即生效为ip2。

cleanHostCache

接口定义

void cleanHostCache(ArrayList<String> hosts)

引入版本

2.2.2

说明
  • 清空操作会同步清空内存缓存和本地缓存。

所属类

HttpDnsService

参数说明

参数

类型

是否必填

说明

hosts

ArrayList<String>

需要清除的host域名数组。如果需要清空全部数据,传null或者空数组即可。