OkHttp和Okio

本文摘要

文本将介绍OkHttp和Okio基本使用

OkHttp

HTTP 是现在APP访问网络最流行的方式。通过它我们可以交换数据和媒体信息。而高效的使用HTTP可以让你的加载数据更快并且节省带宽。

OkHttp就是一种HTTP客户端连接,它有如下特性:

  1. HTTP/2多路复用Socket到同一个主机,共享链接。
  2. 采用连接池技术,可以有效的减少Http链接数量。
  3. 无缝集成GZIP压缩技术。
  4. 支持Response Cache,避免重复请求。
  5. 域名多IP支持。

OkHttp可以处理常见的网络问题:

  1. 如果OkHttp连接一个域名失败后,它会尝试连接下一个该域名的IP地址。(需要DNS支持
  2. OkHttp在初始化链接的时候,会采用最新的TLS特性(SNI,ALPN),如果失败会采用TLS1.0进行链接。

使用OkHttp是非常简单的。它的request/response API采用非常流畅的Builder模式构建。 并且它支持同步阻塞调用以及异步调用。

OkHttp支持Android2.3+。对于Java最低支持1.7+

OkHttp会自动管理HTTP连接的生命周期

  1. 操作Response.body().string()等类型的API,OkHttp会自动将该HTTP连接加入到ConnectionPool中或者直接释放连接
  2. 如果采用stream方式操作流,则需要自己手动关闭,否则会发生HTTP连接泄漏(OkHttp通过WeakReference机制,尽最大努力管理这些泄漏的HTTP连接)
  3. OkHttp不读取Resonse#Head#Keep-Alive属性来决定该HTTP连接是否能复用,而是直接加入到ConnectionPool进行复用
  4. 当从ConnectionPool中获取HTTP连接的时候,OkHttp发现该HTTP连接已经失效,则关闭该连接,并且重新选择一个HTTP连接进行复用

GET 请求

package com.company;

import okhttp3.*;

public class Main {

    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();
        //请求
        Request request = new Request.Builder()
                .url("http://www.baidu.com/")
                .get()
                .build();
        //发起请求
        Response response = client.newCall(request).execute();
        //结果
        System.out.println(response.body().string());
    }
}

POST 请求

package com.company;

import okhttp3.*;

public class Main {

    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();
        //参数
        RequestBody requestBody = new FormBody.Builder()
                .add("DGM", "DGM")
                .build();
        //请求
        Request request = new Request.Builder()
                .url("http://www.baidu.com/")
                .post(requestBody)
                .build();
        //发起请求
        Response response = client.newCall(request).execute();
        //结果
        System.out.println(response.body().string());
    }
}

引入项目中:

Maven

com.squareup.okhttp3
okhttp
(insert latest version)

Gradle
compile ‘com.squareup.okhttp3:okhttp:(insert latest version)’

PS: (insert latest version) 请替换成 官网最新的

Okio

Okio是一款新的类库,它可以使得 java.io.* 和 java.nio.* 更加方便的被使用以及处理数据。 现在我的一些文件操作或者流 必用Okio。

Copy文件的例子

package com.company;

import okio.BufferedSink;
import okio.BufferedSource;
import okio.Okio;

import java.io.File;

public class Main {

    public static void main(String[] args) throws Exception {
        //创建buffer
        BufferedSource source = Okio.buffer(Okio.source(new File("data/file1")));
        BufferedSink sink = Okio.buffer(Okio.sink(new File("data/file" + System.currentTimeMillis())));
        //copy数据
        sink.writeAll(source);
        //关闭资源
        sink.close();
        source.close();
    }
}

可以发现,通过Okio可以非常方便的处理io数据。

ByteString 和 Buffer

在Okio中通过ByteString和Buffer这两种类型,提供了高性能和简单的API:

  1. ByteString是一种不可改变的byte序列。提供了一种基于String,采用char访问的二进制模式。通过ByteString可以像一般value一样处理二进制数据。并且提供了对encode/decode中的HEX,Base64以及UTF-8支持。
  2. Buffer是一种可变的byte序列。就像ArrayList一样,你不需要知道Buffer的大小。在处理buffer的read/write的时候,就像queue一样。

通过这两个类,可以极大的增强io访问的数据处理。

Source 和 Sink

这两个类是在 InputStream 以及 OutputStream 上进行抽象而成的。 它还具有如下特性:

  1. Timeout: 可以提供超时处理机制。
  2. Easy to implement: Source 仅仅声明了read,close,timeout方法。实现起来非常的方便。
  3. Easy to use:通过实现/使用BufferedSource和BufferedSink接口,可以更加方便的操作二进制数据。
  4. No artificial distinction between byte streams and char streams:可以非常方便的将二进制数据处理为UTF-8字符串,int等类型数据。

Source 和 Sink 实现了InputStream 以及 OutputStream。你可以将Source看成InputStream,将Sink看成OutputStream。而通过BufferedSource和BufferedSink可以非常方便的进行数据处理。

总结

通过开源的square工具,我们可以非常方便的处理io以及http数据。在最新的Android6.0+中,已经剔除了Apache URLConnection类,而采用OkHttp。所以可见OkHttp的代码质量还有有保证的。

链接:
  1. Okio
  2. OkHttp
  3. 来源
gdky005 wechat
加微信好友,一起交流