前言
- 本文涉及源码均基于
okhttp 3.14.9
。
一、OkHttp简介
-
OkHttp
是Android开发最常用的网络请求框架,由Square
公司开源。 -
Android4.4以后,源码中
HttpURLConnection
底层实现已经替换成了OKHttp
。 - 目前流行的
Retrofit
框架底层也是基于OKHttp
实现。 -
OkHttp4.x
已经改为kotlin
实现。
二、OkHttp优点
- 支持
Http1
、Http2
、Quic
和WebSocket
协议。 - 连接池复用底层
TCP(Socket)
,减少请求延时。 - 支持
GZIP
,减少数据流量。 - 缓存响应数据减少重复的网络请求 。
- 请求失败支持自动重试其他IP。
- 支持自动重定向。
三、基本配置
依赖导入
项目导入依赖
implementation 'com.squareup.okhttp3:okhttp:3.14.9'
权限配置
使用时,需要在清单文件AndroidManifest.xml
中配置网络使用权限
<uses-permission android:name="android.permission.INTERNET" />
四、OkHttp使用流程
由上图可知,使用OkHttp发起一个请求的具体步骤如下:
- 1 通过
OkHttpClient.Builder
创建OkHttpClient
- 2 通过
Request.Builder
创建Request
- 3 调用
OkHttpClient
对象的newCall
方法,传入Request
,生成Call
- 4 由
Call
对象调用execute
或者enqueue
方法得到响应Response
五、Get 方式发起请求
同步请求
String url="xxx";
OkHttpClient client = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url(url).build();
Call call = client.newCall(request);
try {
Response response = call.execute();
Log.d(TAG, response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
异步请求
String url="xxx";
OkHttpClient client = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url(url).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, response.body().string());
}
});
六、归纳小结
由上述流程和例子可知:
- 使用
OkHttp
发起一次请求时,核心是OkHttpClient
、Request
和Call
三个角色。 - 其中
OkHttpClient
、Request
的创建使用均由对应的Builder
实现(经典的建造者设计模式)。 -
使用
Call
对象的execute
方法发起的是同步请求,而enqueue
方法则是异步请求。