以下将详细介绍如何编写一个自定义的 OkHttp 拦截器,包括实现步骤、代码示例及使用方法。
实现步骤
- 创建拦截器类:编写一个类实现
Interceptor
接口,该接口位于okhttp3
包中,需要重写intercept
方法。 - 在
intercept
方法中处理请求和响应:在intercept
方法里,可以对请求进行修改、添加额外的处理逻辑,也能对响应进行处理。通过Chain
对象获取原始请求,还能将修改后的请求传递给下一个拦截器,并获取响应。 - 添加拦截器到 OkHttpClient:创建
OkHttpClient
实例时,使用OkHttpClient.Builder
的addInterceptor
或addNetworkInterceptor
方法添加自定义拦截器。
代码示例
自定义日志拦截器
下面是一个简单的自定义日志拦截器示例,用于记录请求和响应的详细信息:
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
// 自定义日志拦截器类
public class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
// 获取原始请求
Request request = chain.request();
// 记录请求信息
long t1 = System.nanoTime();
System.out.println(String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
// 继续处理请求,获取响应
Response response = chain.proceed(request);
// 记录响应信息
long t2 = System.nanoTime();
System.out.println(String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
}
自定义请求头拦截器
以下示例展示了如何编写一个自定义拦截器来添加请求头:
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
// 自定义请求头拦截器类
public class HeaderInterceptor implements Interceptor {
private String headerName;
private String headerValue;
// 构造函数,用于传入请求头的名称和值
public HeaderInterceptor(String headerName, String headerValue) {
this.headerName = headerName;
this.headerValue = headerValue;
}
@Override
public Response intercept(Chain chain) throws IOException {
// 获取原始请求
Request originalRequest = chain.request();
// 创建新的请求,添加自定义请求头
Request newRequest = originalRequest.newBuilder()
.header(headerName, headerValue)
.build();
// 继续处理修改后的请求
return chain.proceed(newRequest);
}
}
使用自定义拦截器
以下是如何在 OkHttpClient
中使用上述自定义拦截器的示例:
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
// 创建 OkHttpClient 并添加拦截器
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.addInterceptor(new HeaderInterceptor("Custom-Header", "Custom-Value"))
.build();
// 创建请求
Request request = new Request.Builder()
.url("https://www.example.com")
.build();
// 发起请求
Response response = client.newCall(request).execute();
// 处理响应
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.out.println("Request failed: " + response.code());
}
}
}
解释
- LoggingInterceptor:记录请求和响应的详细信息,包括请求的 URL、连接信息、请求头、响应时间和响应头。
- HeaderInterceptor:在请求中添加自定义的请求头,可用于身份验证、版本信息等。
- Main 类:创建
OkHttpClient
实例,添加自定义拦截器,发起网络请求并处理响应。
通过以上步骤,你可以编写并使用自定义的 OkHttp 拦截器来满足不同的需求。