All Products
Search
Document Center

HTTPDNS:Praktik Terbaik untuk Menggunakan HTTPDNS dengan OkHttp di Android

Last Updated:Jan 22, 2026

Topik proses integrasi Android SDK menyediakan panduan lengkap untuk mengimpor dan mengonfigurasi kit pengembangan perangkat lunak (SDK) Android, melakukan resolusi alamat IP, menerapkannya pada pustaka jaringan Anda, serta memverifikasi integrasinya. Topik ini berfokus pada solusi spesifik untuk mengintegrasikan HTTPDNS dengan OkHttp.

1. Latar Belakang

Jika Anda menggunakan OkHttp sebagai kerangka kerja jaringan di Android, Anda dapat secara efisien mengintegrasikan layanan HTTPDNS melalui antarmuka DNS kustom yang disediakan oleh OkHttp.

OkHttp adalah kerangka kerja Android ringan sumber terbuka untuk memproses permintaan jaringan. Ini dikembangkan oleh Square sebagai alternatif dari HttpURLConnection dan Apache HttpClient. Sejak dirilis, OkHttp telah mendapatkan popularitas di kalangan pengembang Android karena semakin matang.

Secara default, OkHttp menggunakan layanan DNS sistem InetAddress untuk resolusi nama domain. Namun, OkHttp juga menyediakan antarmuka untuk menyesuaikan layanan DNS, yang dapat Anda gunakan guna mengintegrasikan HTTPDNS.

Catatan

Metode ini juga berlaku untuk Retrofit+OkHttp. Anda dapat meneruskan OkHttpClient yang telah dikonfigurasi sebagai parameter ke Retrofit.Builder::client(OkHttpClient).

2. Antarmuka DNS Kustom

OkHttp menyediakan API Dns yang memungkinkan pengembang menyesuaikan resolusi DNS:

class OkHttpDns constructor(context: Context): Dns {
    private var mContext: Context

    init {
        mContext = context
    }
    @Throws(UnknownHostException::class)
    override fun lookup(host: String): List<InetAddress> {
        val httpdnsResult: HTTPDNSResult = HttpDns.getService(accountID)
            .getHttpDnsResultForHostSyncNonBlocking(host, RequestIpType.auto)
        val inetAddresses: MutableList<InetAddress> = ArrayList()
        var address: InetAddress
        try {
            if (httpdnsResult.ips != null) {
                // Proses alamat IPv4.
                for (ipv4 in httpdnsResult.ips) {
                    address = InetAddress.getByName(ipv4)
                    inetAddresses.add(address)
                }
            }
            if (httpdnsResult.ipv6s != null) {
                // Proses alamat IPv6.
                for (ipv6 in httpdnsResult.ipv6s) {
                    address = InetAddress.getByName(ipv6)
                    inetAddresses.add(address)
                }
            }
        } catch (e: UnknownHostException) {
        }
        return if (!inetAddresses.isEmpty()) {
            inetAddresses
        } else Dns.SYSTEM.lookup(host)
    }
}
public class OkHttpDns implements Dns {
    private Context mContext;
    public OkHttpDns(Context context) {
        mContext = context;
    }
    @Override
    public List<InetAddress> lookup(String host) throws UnknownHostException {
        HTTPDNSResult httpdnsResult = HttpDns.getService(accountID).getHttpDnsResultForHostSync(host, RequestIpType.both);
        List<InetAddress> inetAddresses = new ArrayList<>();
        InetAddress address;
        try {
            if (httpdnsResult.getIps() != null) {
                // Proses alamat IPv4
                for (String ipv4 : httpdnsResult.getIps()) {
                    address = InetAddress.getByName(ipv4);
                    inetAddresses.add(address);
                }
            }

            if (httpdnsResult.getIpv6s() != null) {
                // Proses alamat IPv6
                for (String ipv6 : httpdnsResult.getIpv6s()) {
                    address = InetAddress.getByName(ipv6);
                    inetAddresses.add(address);
                }
            }
        } catch (UnknownHostException e) {

        }

        if (!inetAddresses.isEmpty()) {
            return inetAddresses;
        }

        return okhttp3.Dns.SYSTEM.lookup(host);
    }
}

Mekanisme pengulangan internal di okhttp dapat memilih alamat IP yang berbeda untuk membuat koneksi selama proses pengulangan. Oleh karena itu, metode lookup() dalam antarmuka Dns dapat mengembalikan List<InetAddress> yang berisi beberapa alamat IP. Pendekatan ini mencegah kegagalan permintaan yang dapat terjadi jika hanya satu alamat IP yang tidak tersedia dikembalikan.

3. Konfigurasikan OkHttpClient

Buat objek OkHttpClient dan teruskan objek OkHttpDns sebagai pengganti layanan DNS default:

private fun initOkHttp(context: Context) {
    val client = OkHttpClient.Builder() 
        // Konfigurasikan pengaturan inisialisasi lainnya dari OkHttp sesuai kebutuhan
        .dns(OkHttpDns(context))
        .build()
}
private void initOkHttp(Context context) {
    OkHttpClient client = new OkHttpClient.Builder()
    // Konfigurasikan pengaturan inisialisasi lainnya dari OkHttp sesuai kebutuhan
    .dns(new OkHttpDns(context))
    .build();
}

Berikut ini adalah kode lengkap untuk implementasi OkHttp dan HTTPDNS.

4. Verifikasi

Setelah integrasi selesai, Anda harus memverifikasi keberhasilannya. Anda dapat menggunakan metode seperti simulasi pembajakan atau pengujian injeksi kesalahan. Untuk informasi selengkapnya, lihat Memverifikasi integrasi pustaka jaringan.

5. Ringkasan

Integrasi OkHttp dan HTTPDNS memberikan manfaat berikut:

  • Anda dapat dengan mudah mengakses layanan HTTPDNS dengan mengimplementasikan antarmuka DNS.

  • Solusi ini kompatibel dengan skenario yang melibatkan HTTPS, Server Name Indication (SNI), dan cookie. Solusi ini menghilangkan kebutuhan untuk verifikasi sertifikat dan pemeriksaan nama domain.