OkHttp3
OkHttp3官网地址:https://square.github.io/okhttp/。在官网查看用法和最新版本。
OkHttp3从4.0.0开始使用Kotlin来编写,但是3.x的版本还在使用java进行更新。
本文以OkHttp 3.5.0版源码来讲解
官方推荐使用方式
- get方法使用同步请求:
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
- post方法使用异步请求:
public static final MediaType JSON
= MediaType.get("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
主要使用的类
类名 | 作用 |
---|---|
OkHttpClient | 全局管理者 |
Request | 请求体 |
Call | 请求发起者 |
Callback | 数据接收通道 |
Response | 响应数据体 |
OkHttpClient
创建OkHttpClient一般有两种方法,一种是直接new OkHttpClient(),另外一种是通过OkHttpClient.Builder()。第二种使用建造者模式,来配置一些参数,比如连接超时时间、读写超时时间、超时重试次数等。使用建造者模式,可以对外屏蔽掉构建client的细节。
OkHttpClient okHttpClient = new OkHttpClient();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.SECONDS)
.writeTimeout(10,TimeUnit.SECONDS)
.readTimeout(10,TimeUnit.SECONDS)
.build();
Request
Request对象主要封装的是一些网络请求的信息,比如请求url,请求方法,请求头,请求体等。
public final class Request {
final HttpUrl url;
final String method;
final Headers headers;
final @Nullable RequestBody body;
final Object tag;
private volatile CacheControl cacheControl; // Lazily initialized.
}
Call和ReadCall
Call
public interface Call extends Cloneable {
Request request();
Response execute() throws IOException;
void enqueue(Callback responseCallback);
interface Factory {
Call newCall(Request request);
}
}
不管我们是使用同步execute()方法还是enqueue()异步方法,都是需要执行OkHttpClient.newCall(Request request)方法的,这个方法返回的是一个Call对象,但是Call是一个接口对象,实际上实现的是ReadCall对象。
@Override
public Call newCall(Request request) {
return RealCall.newRealCall(this, request, false /* for web socket */);
}
RealCall
final class RealCall implements Call {
}
拦截器Interceptor
OkHttp的拦截器分为两种类型,在OkHttpClient.Builder的方法中也可以很清晰地看到,分别是addInterceptor(Interceptor interceptor)和addNetworkInterceptor(Interceptor interceptor)方法。这两种类型,分别是Application Interceptors(应用程序拦截器)和Network Interceptors(网络拦截器)。
类 | 说明 |
---|---|
RetryAndFollowUpInterceptor | 失败重试 |
BridgeInterceptor | 请求和响应转化 |
CacheInterceptor | 缓存 |
ConnectInterceptor | 与服务器建立连接 |
CallServerInterceptor | 数据传输 |
public final class RetryAndFollowUpInterceptor implements Interceptor {
}
public final class BridgeInterceptor implements Interceptor {
}
public final class CacheInterceptor implements Interceptor {
}
public final class ConnectInterceptor implements Interceptor {
}
public final class CallServerInterceptor implements Interceptor {
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
--------------------last line for now--------------------