All Products
Search
Document Center

HTTPDNS:Praktik terbaik penggunaan HTTPDNS dengan Apache HttpClient di Java

Last Updated:Jan 10, 2026

Dokumen ini menjelaskan cara mengintegrasikan HTTPDNS dengan Apache HttpClient dalam aplikasi Java.

1. Latar Belakang

Apache HttpClient adalah pustaka jaringan HTTP yang banyak digunakan dalam ekosistem Java dan tersedia dalam dua versi utama: 4.x dan 5.x. Anda dapat mengintegrasikan HTTPDNS ke dalam HttpClient dengan mengimplementasikan antarmuka DnsResolver.

2. Implementasikan DnsResolver kustom

HttpClient 5.x

import org.apache.hc.client5.http.DnsResolver;
import com.alibaba.sdk.java.httpdns.HttpDnsClient;
import com.alibaba.sdk.java.httpdns.HTTPDNSResult;
import com.alibaba.sdk.java.httpdns.RequestIpType;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

public class HttpDnsResolver implements DnsResolver {
    
    private final HttpDnsClient httpDnsClient;
    
    public HttpDnsResolver(HttpDnsClient httpDnsClient) {
        this.httpDnsClient = httpDnsClient;
    }

    @Override
    public String resolveCanonicalHostname(String host) {
        return host;
    }

    @Override
    public InetAddress[] resolve(String host) throws UnknownHostException {
        HTTPDNSResult result = httpDnsClient.getHttpDnsResultForHostSyncNonBlocking(host, RequestIpType.both);

        List<InetAddress> addresses = new ArrayList<>();
        try {
            if (result != null && result.getIps() != null) {
                for (String ip : result.getIps()) {
                    addresses.add(InetAddress.getByName(ip));
                }
            }
            if (result != null && result.getIpv6s() != null) {
                for (String ip : result.getIpv6s()) {
                    addresses.add(InetAddress.getByName(ip));
                }
            }
        } catch (UnknownHostException e) {
            // Abaikan kegagalan mengurai satu alamat IP.
        }
        
        if (!addresses.isEmpty()) {
            return addresses.toArray(new InetAddress[0]);
        }
        
        // Turun ke DNS sistem.
        return InetAddress.getAllByName(host);
    }
}

HttpClient 4.x

import org.apache.http.conn.DnsResolver;
import com.alibaba.sdk.java.httpdns.HttpDnsClient;
import com.alibaba.sdk.java.httpdns.HTTPDNSResult;
import com.alibaba.sdk.java.httpdns.RequestIpType;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

public class HttpDnsResolver4 implements DnsResolver {
    
    private final HttpDnsClient httpDnsClient;
    
    public HttpDnsResolver4(HttpDnsClient httpDnsClient) {
        this.httpDnsClient = httpDnsClient;
    }

    @Override
    public InetAddress[] resolve(String host) throws UnknownHostException {
        HTTPDNSResult result = httpDnsClient.getHttpDnsResultForHostSyncNonBlocking(host, RequestIpType.both);

        List<InetAddress> addresses = new ArrayList<>();
        try {
            if (result != null && result.getIps() != null) {
                for (String ip : result.getIps()) {
                    addresses.add(InetAddress.getByName(ip));
                }
            }
            if (result != null && result.getIpv6s() != null) {
                for (String ip : result.getIpv6s()) {
                    addresses.add(InetAddress.getByName(ip));
                }
            }
        } catch (UnknownHostException e) {
            // Abaikan kegagalan mengurai satu alamat IP.
        }
        
        if (!addresses.isEmpty()) {
            return addresses.toArray(new InetAddress[0]);
        }
        
        // Turun ke DNS sistem.
        return InetAddress.getAllByName(host);
    }
}
Catatan

DnsResolver untuk versi 4.x dan 5.x berasal dari paket yang berbeda. Untuk versi 5.x, Anda juga harus mengimplementasikan metode resolveCanonicalHostname().

3. Konfigurasikan HttpClient

HttpClient 5.x

import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
import org.apache.hc.client5.http.io.HttpClientConnectionManager;

HttpDnsClient httpDnsClient = HttpDnsClient.getClient(accountId);

HttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
    .setDnsResolver(new HttpDnsResolver(httpDnsClient))
    .build();

CloseableHttpClient httpClient = HttpClients.custom()
    .setConnectionManager(connectionManager)
    .build();

HttpClient 4.x

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

HttpDnsClient httpDnsClient = HttpDnsClient.getClient(accountId);

CloseableHttpClient httpClient = HttpClients.custom()
    .setDnsResolver(new HttpDnsResolver4(httpDnsClient))
    .build();

4. Ringkasan

Keunggulan utama menggunakan Apache HttpClient dengan HTTPDNS adalah:

  • Implementasi sederhana: Cukup implementasikan antarmuka DnsResolver untuk mengintegrasikan HTTPDNS.

  • Fleksibilitas tinggi: Berfungsi dalam berbagai skenario seperti HTTPS, Server Name Indication (SNI), dan pengaturan cookie tanpa perlu menangani langkah tambahan seperti validasi Sertifikat atau verifikasi Nama domain.

  • Kompatibilitas versi: Mendukung HttpClient 4.x dan 5.x.