一.简介
OkHttp是一个高效的HTTP客户端,它有以下默认特性:
支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接
连接池减少请求延时
透明的GZIP压缩减少响应数据的大小
缓存响应内容,避免一些完全重复的请求
当网络出现问题的时候OkHttp依然坚守自己的职责,它会自动恢复一般的连接问题,如果你的服务有多个IP地址,当第一个IP请求失败时,OkHttp会交替尝试你配置的其他IP,OkHttp使用现代TLS技术(SNI, ALPN)初始化新的连接,当握手失败时会回退到TLS 1.0。
note: OkHttp 支持 Android 2.3 及以上版本Android平台, 对应于 Java, JDK 1.7及以上.
二.使用
OkHttp的使用是非常简单的. 它的请求/响应 API 使用构造器模式builders来设计,它支持阻塞式的同步请求和带回调的异步请求。 官网:https://github.com/square/okhttp
添加依赖:
compile 'com.squareup.okhttp3:okhttp:3.11.0'
2.1 GET请求
-new OkHttpClient;
-构造Request对象;
-通过前两步中的对象构建Call对象;
-通过Call#enqueue(Callback)方法来提交异步请求;
String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(url)
.get()//默认就是GET请求,可以不写
.build();
Call call = okHttpClient.newCall(request);
2.2 POST请求
OkHttpClient okHttpClient = new OkHttpClient(); // 创建client对象
FormBody formBody = new FormBody.Builder() // form表单
.add("name","lisi")
.build();
Request request = new Request.Builder()
.post(formBody)
.url(food_url).build(); // 创建 请求数据的参数对象
Call call = okHttpClient.newCall(request);
....类同
2.3 同步和异步
同步;阻塞式,再当前线程执行逻辑
异步:在当前线程里新建线程执行逻辑,适合耗时任务逻辑。
// 调取异步方法,获取数据
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
}
// 调取同步方法,接收返回对象
Response execute = call.execute();
2.4 okhttp添加缓存
long maxSize = 1024 * 1024 * 4; //设置缓存的大小4Mb
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(new Cache(getCacheDir(), maxSize))// 设置缓存存放目录
.build();
Request request = new Request.Builder().url("http://gank.io/api/data/%E7%A6%8F%E5%88%A9/20/1").build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().string());
}
});