Android拦截器详解及示例

1. 引言

在Android开发中,我们经常需要对网络请求进行拦截和处理,例如添加公共参数、设置请求头、打印日志等。Android提供了拦截器(Interceptor)机制,可以方便地对请求进行处理和修改。本文将介绍拦截器的原理、用法,并通过示例代码演示如何拦截其他请求。

2. 拦截器原理

拦截器是一种特殊的过滤器,它可以在请求前或请求后对请求进行处理和修改。在Android中,拦截器是通过OkHttp库实现的。OkHttp是一个强大的开源HTTP客户端,它提供了丰富的功能和灵活的拦截器机制。

拦截器是通过Interceptor接口实现的,它包含一个intercept方法,用于拦截请求并返回响应。在intercept方法中,我们可以对请求进行修改、添加公共参数、设置请求头等操作,然后通过Chain对象继续发送请求。

3. 拦截器用法

3.1 添加拦截器

我们可以通过OkHttpClientaddInterceptor方法添加拦截器,示例代码如下:

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();