全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 阿里云办公 培训与认证 物联网
HTTPDNS

HttpDns+OkHttp最佳实践

更新时间:2017-06-07 13:26:11   分享:   

HTTPS(含SNI)业务场景“IP直连”方案说明一文介绍了利用HttpDns解析获得ip后进行ip直连的通用方法。但是如果您在Android端使用的网络框架是OkHttp,通过调用OkHttp提供的自定义Dns服务接口,可以更为优雅地使用HttpDns的服务。

OkHttp是一个处理网络请求的开源项目,是Android端最火热的轻量级框架,由移动支付Square公司贡献用于替代HttpUrlConnection和Apache HttpClient。随着OkHttp的不断成熟,越来越多的Android开发者使用OkHttp作为网络框架。

OkHttp默认使用系统DNS服务InetAddress进行域名解析,但同时也暴露了自定义DNS服务的接口,通过该接口我们可以优雅地使用HttpDns。

1. 自定义DNS接口

OkHttp暴露了一个Dns接口,通过实现该接口,我们可以自定义Dns服务:

  1. public class OkHttpDns implements Dns {
  2. private static final Dns SYSTEM = Dns.SYSTEM;
  3. HttpDnsService httpdns;//httpdns 解析服务
  4. private static OkHttpDns instance = null;
  5. private OkHttpDns(Context context) {
  6. this.httpdns = HttpDns.getService(context, "account id");
  7. }
  8. public static OkHttpDns getInstance(Context context) {
  9. if(instance == null) {
  10. instance = new OkHttpDns(context);
  11. }
  12. return instance;
  13. }
  14. @Override
  15. public List<InetAddress> lookup(String hostname) throws UnknownHostException {
  16. //通过异步解析接口获取ip
  17. String ip = httpdns.getIpByHostAsync(hostname);
  18. if(ip != null) {
  19. //如果ip不为null,直接使用该ip进行网络请求
  20. List<InetAddress> inetAddresses = Arrays.asList(InetAddress.getAllByName(ip));
  21. Log.e("OkHttpDns", "inetAddresses:" + inetAddresses);
  22. return inetAddresses;
  23. }
  24. //如果返回null,走系统DNS服务解析域名
  25. return Dns.SYSTEM.lookup(hostname);
  26. }
  27. }

2. 创建OkHttpClient

创建OkHttpClient对象,传入OkHttpDns对象代替默认Dns服务:

  1. private void okhttpDnsRequest() {
  2. OkHttpClient client = new OkHttpClient.Builder()
  3. .dns(OkHttpDns.getInstance(getApplicationContext()))
  4. .build();
  5. Request request = new Request.Builder()
  6. .url("http://www.aliyun.com")
  7. .build();
  8. Response response = null;
  9. client.newCall(request).enqueue(new Callback() {
  10. @Override
  11. public void onFailure(Call call, IOException e) {
  12. e.printStackTrace();
  13. }
  14. @Override
  15. public void onResponse(Call call, Response response) throws IOException {
  16. if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
  17. DataInputStream dis = new DataInputStream(response.body().byteStream());
  18. int len;
  19. byte[] buff = new byte[4096];
  20. StringBuilder result = new StringBuilder();
  21. while ((len = dis.read(buff)) != -1) {
  22. result.append(new String(buff, 0, len));
  23. }
  24. Log.d("OkHttpDns", "Response: " + result.toString());
  25. }
  26. });
  27. }

以上就是OkHttp+HttpDns实现的全部代码。

3. 总结

相比于通用方案,OkHttp+HttpDns有以下两个主要优势:

  • 实现简单,只需通过实现Dns接口即可接入HttpDns服务
  • 通用性强,该方案在HTTPS,SNI以及设置Cookie等场景均适用。规避了证书校验,域名检查等环节
本文导读目录
本文导读目录
以上内容是否对您有帮助?