You need to enable JavaScript to run this app.
导航

OkHttp 或 Retrofit

最近更新时间2024.03.29 17:41:10

首次发布时间2023.03.22 20:49:16

方案描述

如果您的 app 使用 OkHttpRetrofit 发送和接收网络请求,您可以通过 OkHttpClient.Builder().dns()OkHttpClient 对象注入火山引擎移动解析(HTTPDNS)提供的解析方法。

前提条件

警告

对于没有在控制台添加的域名,HTTPDNS 服务端的解析会失败,您只能获得 Local DNS 服务器的解析结果。参见 添加需要解析的域名了解如何添加域名。

实现步骤

在创建 OkHttpClient 对象时,在 OkHttpClient.Builder().dns() 中调用 getHttpDnsResult 方法获取移动解析 HTTPDNS 的解析结果。
示例代码中使用了 getHttpDnsResultForHostSyncBlock 方法。该方法会阻塞后续代码的运行,直到 SDK 获取到域名解析结果。您也可以使用异步方法 getHttpDnsResultForHostAsync

注意

为了演示需要,示例代码仅提供了集成方案中最基本的逻辑。移动解析 HTTPDNS 仅保证 HTTPDNS SDK 本身的 可用性。在生产环境下,您需要自行保证集成方案的健壮性。

OkHttpClient okHttpClient = new OkHttpClient.Builder().dns(new Dns() {
    @Override
    public List<InetAddress> lookup(String hostname) throws UnknownHostException {
        long beforeResolve = System.currentTimeMillis();
        // 调用 getHttpDnsResultForHostSyncBlock 获取域名解析结果
        DnsResult dnsResult = HttpDns.getService().getHttpDnsResultForHostSyncBlock(hostname);
        long cost = System.currentTimeMillis() - beforeResolve;
        // 如果 HTTPDNS 服务端解析成功,返回 HTTPDNS 服务端的解析结果
        if (dnsResult != null && (!dnsResult.ipv4List.isEmpty() || !dnsResult.ipv6List.isEmpty())) {
           
            List<InetAddress> inetAddresses = new ArrayList<>();
            Iterator<String> itV6 = dnsResult.ipv6List.iterator();
            Iterator<String> itV4 = dnsResult.ipv4List.iterator();
            while (itV6.hasNext() || itV4.hasNext()) {
                 if (itV6.hasNext()) {
                      inetAddresses.add(InetAddress.getByName(itV6.next()));
                 }
                 if (itV4.hasNext()) {
                      inetAddresses.add(InetAddress.getByName(itV4.next()));
                 }
            }

            return inetAddresses;
        } else {
            // 如果 HTTPDNS 服务端解析失败,则使用 Local DNS 返回的结果
            textView.post(() -> {
                StringBuilder stringBuilder = new StringBuilder("httpdns resolve failed for " + hostname + ", fallback to localdns\n");
                if (dnsResult != null) {
                    List<DnsTaskInfo> taskInfos = dnsResult.taskInfoList;
                    for (DnsTaskInfo taskInfo : taskInfos) {
                        dnsResultString.append(taskInfo.toJson()).append("\n");
                    }
                }
                Log.e(TAG, dnsResultString.toString());
                textView.setText(stringBuilder.toString());
                textView.append("\n");
            });
            // 如果 HTTPDNS SDK 通过 HTTPDNS 服务端和 Local DNS 服务器的解析都失败了,
            // 您可以使用 OkHttp 提供的方法再次向 Local DNS 服务器发起查询请求。
            return Dns.SYSTEM.lookup(hostname);
        }
    }

开发注意事项

App 开启代理时,您的 app 仍然可以通过该集成方案发送和接收请求,但是 SDK 只返回 Local DNS 的解析结果。

相关信息

如果您需要了解 HTTPDNS Android SDK 的详细信息,参见 Android SDK 参考