すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud DNS:Android の OkHttp フレームワークに HTTPDNS Android SDK を統合するためのベストプラクティス

最終更新日:Nov 09, 2025

このドキュメントでは、HTTPDNS Android ソフトウェア開発キット (SDK) を Android の OkHttp フレームワークに統合する方法について説明します。

概要

OkHttp は、ネットワークリクエストを処理する Android 向けの、人気のある軽量なオープンソースフレームワークです。モバイル決済会社の Square によって HttpURLConnection および Apache HttpClient の代替として開発された OkHttp は、多くの Android 開発者にとって好ましいネットワークフレームワークとなっています。一般的なソリューションと比較して、OkHttp を HTTPDNS Android SDK と共に使用すると、主に 2 つの利点があります。

  • シンプルな実装。DNS インターフェイスを実装することで、HTTPDNS 名前解決サービスにアクセスできます。

  • 幅広く適用可能です。 HTTPS に追加の構成は必要ありません。

ユースケース

デフォルトでは、OkHttp はドメイン名の名前解決にシステム DNS サービス InetAddress を使用します。ただし、OkHttp は DNS インターフェイスも提供します。OkHttp フレームワークの設計により、このインターフェイスを実装することで、HTTPDNS Android SDK をネットワークアクセスに簡単に使用できます。HTTPS やサーバ名表示 (SNI) を使用する HTTPS などの複雑なシナリオでも、追加の処理は必要ありません。統合は最小限の侵入で済みます。

重要

DNS インターフェイスを実装すると、現在の OkHttpClient インスタンスによって処理されるすべてのネットワークリクエストが HTTPDNS を通過することを意味します。一部のドメイン名のみを HTTPDNS で解決する必要がある場合は、HTTPDNS Android SDK の名前解決インターフェイスを呼び出す前にドメイン名をフィルター処理する必要があります。

統合ガイド

1. Dns API をカスタマイズする

OkHttp は DNS インターフェイスを公開します。このインターフェイスを実装することで、DNS サービスをカスタマイズできます。OkHttp シナリオで HTTPDNS Android SDK を統合するためのベストプラクティスを示す完全なサンプルコードについては、「デモプロジェクトのソースコード」をご参照ください。

  1. プロジェクトディレクトリに新しいクラスを作成して、Dns API を実装します。

  2. Android SDK 開発ガイドで提供されている API に従って、カスタム DNS の lookup メソッドをオーバーライドして、ドメイン名解決操作を実行します。

  public class OkHttpDns implements Dns {

    private static OkHttpDns instance;
    private static Object lock = new Object();
    private DNSResolver mDNSResolver = DNSResolver.getInstance();

    private OkHttpDns() {
    }

    public static OkHttpDns getInstance() {
        if (null == instance) {
            synchronized (lock) {
                if (instance == null) {
                    instance = new OkHttpDns();
                }
            }
        }
        return instance;
    }

    @Override
    public List<InetAddress> lookup(@NonNull String hostname) throws UnknownHostException {
        // HTTPDNS Android SDK が提供する API を呼び出してドメイン名を解決します。
        String[] IPArray = mDNSResolver.getIpv4ByHostFromCache(hostname,true);
        if (IPArray == null || IPArray.length == 0){
            IPArray = mDNSResolver.getIPsV4ByHost(hostname);
        }
        if (IPArray != null && IPArray.length > 0) {
            List<InetAddress> inetAddresses = new ArrayList<>();
            InetAddress address;
            for (String ip : IPArray) {
                Log.d(TAG, "mDnsCache IP: " +hostname+ ip);
                address = InetAddress.getByName(ip);
                inetAddresses.add(address);
            }
            if (!inetAddresses.isEmpty()) {
                return inetAddresses;
            }
        }
        // null が返された場合、システム DNS サービスがドメイン名を解決します。
        return okhttp3.Dns.SYSTEM.lookup(hostname);
    }
}

2. OkHttpClient を作成する

public void okhttpDnsRequest(String url, final Handler mHandler) {
        OkHttpClient client = new OkHttpClient.Builder()
                .dns(OkHttpDns.getInstance())
                .build();

        Request request = new Request.Builder()
                .url(url)
                .build();

        Response response = null;
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (!response.isSuccessful()) {
                    throw new IOException("Unexpected code " + response);
                }

                DataInputStream dis = new DataInputStream(response.body().byteStream());
                int len;
                byte[] buff = new byte[4096];
                StringBuilder result = new StringBuilder();
                while ((len = dis.read(buff)) != -1) {
                    result.append(new String(buff, 0, len));
                }

                String resultInfo = result.toString();
                Log.d("OkHttpDns", "Response: " + resultInfo);
             }
        });
    }
重要
  1. これらのベストプラクティスは、HTTPDNS Android SDK を OkHttp と統合するシナリオにのみ適用されます。

  2. HTTPDNS Android SDK の名前解決サービスの使用方法と HTTPDNS Android SDK の統合方法の詳細については、「Android SDK 開発ガイド」をご参照ください。

  3. OkHttp フレームワークシナリオで HTTPDNS Android SDK を統合するためのベストプラクティスを示す完全なサンプルコードについては、「デモプロジェクトのソースコード」をご参照ください。