このドキュメントでは、OkHttp を使用して Java アプリケーションに HTTPDNS を統合する方法について説明します。
1. 背景情報
Java アプリケーションで OkHttp ネットワークフレームワークを使用している場合、OkHttp のカスタム DNS インターフェイスを実装することで、HTTPDNS サービスを簡単に統合できます。
OkHttp は、ネットワークリクエストを処理するためのオープンソースプロジェクトです。モバイル決済企業の Square 社によって開発された、Java および Android アプリケーション向けの人気の高い軽量フレームワークです。このフレームワークが成熟するにつれて、多くの開発者が自身のアプリケーションに採用するようになりました。
デフォルトでは、OkHttp は InetAddress クラスを介してシステムの DNS サービスを使用し、名前解決を行います。また、OkHttp はカスタム DNS サービスを指定できるインターフェイスを公開しています。このインターフェイスを使用して HTTPDNS を統合できます。
2. カスタム DNS インターフェイスの実装
OkHttp は Dns インターフェイスを公開しています。このインターフェイスを実装して、カスタム DNS サービスを作成します。
import com.alibaba.sdk.java.httpdns.HTTPDNSResult;
import com.alibaba.sdk.java.httpdns.HttpDnsClient;
import com.alibaba.sdk.java.httpdns.RequestIpType;
import okhttp3.Dns;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
public class OkHttpDns implements Dns {
private final HttpDnsClient httpDnsClient;
public OkHttpDns(HttpDnsClient httpDnsClient) {
this.httpDnsClient = httpDnsClient;
}
@Override
public List<InetAddress> lookup(String hostname) throws UnknownHostException {
HTTPDNSResult result = httpDnsClient.getHttpDnsResultForHostSyncNonBlocking(
hostname,
RequestIpType.both
);
List<InetAddress> inetAddresses = new ArrayList<>();
try {
if (result != null && result.getIps() != null) {
for (String ip : result.getIps()) {
inetAddresses.add(InetAddress.getByName(ip));
}
}
if (result != null && result.getIpv6s() != null) {
for (String ip : result.getIpv6s()) {
inetAddresses.add(InetAddress.getByName(ip));
}
}
} catch (UnknownHostException e) {
// 単一の IP アドレスの解析失敗は無視します。
}
if (!inetAddresses.isEmpty()) {
return inetAddresses;
}
// システム DNS にフォールバックします。
return Dns.SYSTEM.lookup(hostname);
}
}OkHttp には、組み込みのリトライメカニズムがあります。リトライ中に、OkHttp は別の IP アドレスを使用して接続を確立することがあります。lookup() メソッドから複数の IP アドレスのリストを返すことで、単一の IP アドレスが利用できない場合にリクエストが失敗するのを防ぐことができます。
3. OkHttpClient の設定
`OkHttpClient` オブジェクトを作成し、カスタム DNS サービスを渡します。
HttpDnsClient httpDnsClient = HttpDnsClient.getClient(accountId);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.dns(new OkHttpDns(httpDnsClient))
.build();4. まとめ
OkHttp で HTTPDNS を使用する主な利点は次のとおりです。
シンプルな実装:
Dnsインターフェイスを実装するだけでサービスを統合できます。高い汎用性: HTTPS、サーバ名表示 (SNI)、Cookie 管理などのシナリオで機能します。証明書の検証やドメイン名の検証に追加の手順は必要ありません。
自動リトライ: 複数の IP アドレスを返した場合、OkHttp は自動的に異なるアドレスで接続をリトライします。