このドキュメントでは、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 を統合するためのベストプラクティスを示す完全なサンプルコードについては、「デモプロジェクトのソースコード」をご参照ください。
プロジェクトディレクトリに新しいクラスを作成して、Dns API を実装します。
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);
}
});
}これらのベストプラクティスは、HTTPDNS Android SDK を OkHttp と統合するシナリオにのみ適用されます。
HTTPDNS Android SDK の名前解決サービスの使用方法と HTTPDNS Android SDK の統合方法の詳細については、「Android SDK 開発ガイド」をご参照ください。
OkHttp フレームワークシナリオで HTTPDNS Android SDK を統合するためのベストプラクティスを示す完全なサンプルコードについては、「デモプロジェクトのソースコード」をご参照ください。