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--------------------