Android拦截器详解及示例
1. 引言
在Android开发中,我们经常需要对网络请求进行拦截和处理,例如添加公共参数、设置请求头、打印日志等。Android提供了拦截器(Interceptor)机制,可以方便地对请求进行处理和修改。本文将介绍拦截器的原理、用法,并通过示例代码演示如何拦截其他请求。
2. 拦截器原理
拦截器是一种特殊的过滤器,它可以在请求前或请求后对请求进行处理和修改。在Android中,拦截器是通过OkHttp库实现的。OkHttp是一个强大的开源HTTP客户端,它提供了丰富的功能和灵活的拦截器机制。
拦截器是通过Interceptor
接口实现的,它包含一个intercept
方法,用于拦截请求并返回响应。在intercept
方法中,我们可以对请求进行修改、添加公共参数、设置请求头等操作,然后通过Chain
对象继续发送请求。
3. 拦截器用法
3.1 添加拦截器
我们可以通过OkHttpClient
的addInterceptor
方法添加拦截器,示例代码如下:
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.build();
在上述代码中,我们通过addInterceptor
方法添加了一个自定义的拦截器LoggingInterceptor
。
3.2 自定义拦截器
我们可以通过实现Interceptor
接口来创建自定义的拦截器。下面是一个示例代码:
public class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long startTime = System.nanoTime();
Log.d("Interceptor", "Sending request: " + request.url());
Response response = chain.proceed(request);
long endTime = System.nanoTime();
Log.d("Interceptor", "Received response in " + (endTime - startTime) / 1e6 + "ms");
return response;
}
}
在上述代码中,我们实现了Interceptor
接口,并重写了intercept
方法。在intercept
方法中,我们首先获取到请求对象request
,然后可以对请求进行修改、添加公共参数、设置请求头等操作。接着,我们调用了chain.proceed(request)
方法继续发送请求,并获得响应对象response
。最后,我们可以对响应进行处理,例如解析响应数据、更新UI等操作。
3.3 拦截其他请求
在某些情况下,我们可能需要对特定的请求进行拦截和处理。例如,我们希望在每个请求中添加一个公共的身份认证参数。我们可以通过判断请求的URL来实现拦截特定请求,示例代码如下:
public class AuthInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
// 判断请求的URL
if (request.url().toString().contains("api.example.com")) {
// 添加身份认证参数
Request newRequest = request.newBuilder()
.addHeader("Authorization", "Bearer token")
.build();
return chain.proceed(newRequest);
}
return chain.proceed(request);
}
}
在上述代码中,我们实现了一个名为AuthInterceptor
的拦截器。在intercept
方法中,我们首先获取到请求对象request
,然后判断请求的URL是否包含"api.example.com"。如果是,我们通过newBuilder
方法创建一个新的请求对象newRequest
,并添加了身份认证参数。最后,我们通过chain.proceed(newRequest)
方法继续发送新的请求。
4. 示例代码
接下来,我们将通过一个示例代码演示如何拦截其他请求。
示例代码如下:
public class MainActivity extends AppCompatActivity {
private OkHttpClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建OkHttpClient对象,并添加拦截器
client = new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.addInterceptor(new AuthInterceptor())
.build();