Android 设置拦截器拦截部分接口

在 Android 应用程序开发中,有时候我们希望拦截应用程序中的部分网络请求,以便对这些请求进行统一的处理或者添加一些额外的逻辑。这时候,可以使用拦截器(Interceptor)来实现这样的需求。本文将介绍如何在 Android 应用程序中设置拦截器来拦截部分接口的网络请求,并对其进行处理。

1. 拦截器介绍

拦截器是 OkHttp 库中的一个重要概念,它允许我们在发送请求和接收响应的过程中对网络请求进行拦截和修改。拦截器可以用于添加、修改或者移除请求头、响应头,修改请求体或者响应体等操作。

2. 实现步骤

2.1 添加 OkHttp 依赖

首先,我们需要在项目的 build.gradle 文件中添加 OkHttp 依赖:

gradleCopy code
dependencies {
    implementation 'com.squareup.okhttp3:okhttp:4.9.0'
}

2.2 创建拦截器

接下来,我们创建一个实现了 Interceptor 接口的类,用于拦截部分接口的请求。下面是一个简单的示例:

javaCopy code
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
public class CustomInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request originalRequest = chain.request();
        // 在这里可以对请求进行处理,例如添加请求头或者修改请求参数
        // 判断是否需要拦截处理
        if (needIntercept(originalRequest)) {
            // 对需要拦截的请求进行处理
            // 这里可以添加自定义逻辑,比如添加统一的请求头
            Request modifiedRequest = originalRequest.newBuilder()
                .addHeader("Authorization", "Bearer your_token_here")
                .build();
            return chain.proceed(modifiedRequest);
        }
        // 对不需要拦截的请求直接放行
        return chain.proceed(originalRequest);
    }
    // 判断是否需要拦截的方法,可以根据自己的需求进行逻辑处理
    private boolean needIntercept(Request request) {
        // 在这里可以根据请求的 URL、方法等信息来判断是否需要拦截
        // 这里简单示例,假设只拦截包含 "intercept" 关键字的接口
        return request.url().toString().contains("intercept");
    }
}

2.3 应用拦截器

最后,在实际使用 OkHttp 发起网络请求之前,我们需要将自定义的拦截器应用到 OkHttp 客户端中。例如:

javaCopy code
import okhttp3.OkHttpClient;
public class MyHttpClient {
    private static OkHttpClient okHttpClient;
    public static OkHttpClient getOkHttpClient() {
        if (okHttpClient == null) {
            // 创建 OkHttpClient 客户端实例,并添加自定义拦截器
            okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new CustomInterceptor())
                .build();
        }
        return okHttpClient;
    }
}

2.4 发起网络请求

现在,我们可以使用 MyHttpClient 类中创建的 OkHttpClient 实例来发送网络请求,拦截器将会根据我们的逻辑对部分接口进行拦截和处理。

javaCopy code
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class Main {
    public static void main(String[] args) {
        OkHttpClient client = MyHttpClient.getOkHttpClient();
        Request request = new Request.Builder()
            .url("https://example.com/api/intercept")
            .build();
        
        try {
            Response response = client.newCall(request).execute();
            System.out.println("Response: " + response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


在发送到特定后端服务的请求中添加统一的身份验证标识。这时候,可以通过设置拦截器来实现这个需求。 以下是一个示例场景和代码:

示例场景

假设我们的应用需要向后端服务发送两类请求:一类是普通用户相关的请求,另一类是管理员相关的请求。对于管理员相关的请求,我们希望在发送请求前自动添加管理员权限的身份验证信息,而对于普通用户的请求则无需添加这些信息。

示例代码

创建拦截器

首先,我们创建一个实现了 Interceptor 接口的拦截器类,用于在发送请求前添加身份验证信息。

javaCopy code
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
public class AuthInterceptor implements Interceptor {
    private String authToken;
    public AuthInterceptor(String authToken) {
        this.authToken = authToken;
    }
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request originalRequest = chain.request();
        // 判断是否需要进行身份验证信息的添加
        if (needAuth(originalRequest)) {
            // 添加管理员权限的身份验证信息
            Request modifiedRequest = originalRequest.newBuilder()
                    .addHeader("Authorization", "Bearer " + authToken)
                    .build();
            return chain.proceed(modifiedRequest);
        }
        // 对普通请求直接放行
        return chain.proceed(originalRequest);
    }
    // 判断是否需要身份验证信息的添加
    private boolean needAuth(Request request) {
        // 假设我们根据请求的 URL 中是否包含 "/admin/" 来判断是否需要管理员权限验证
        return request.url().toString().contains("/admin/");
    }
}

应用拦截器

然后,我们在实际使用的地方将自定义的拦截器应用到 OkHttp 客户端中。

javaCopy code
import okhttp3.OkHttpClient;
public class MyHttpClient {
    private static OkHttpClient okHttpClient;
    // 添加身份验证的 token
    private static final String ADMIN_TOKEN = "your_admin_token_here";
    public static OkHttpClient getOkHttpClient() {
        if (okHttpClient == null) {
            // 创建 OkHttpClient 客户端实例,并添加自定义拦截器
            okHttpClient = new OkHttpClient.Builder()
                    .addInterceptor(new AuthInterceptor(ADMIN_TOKEN))
                    .build();
        }
        return okHttpClient;
    }
}

发起网络请求

最后,我们可以使用 MyHttpClient 类中创建的 OkHttpClient 实例来发送网络请求,拦截器将会根据我们的逻辑对部分接口进行拦截和处理。

javaCopy code
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class Main {
    public static void main(String[] args) {
        OkHttpClient client = MyHttpClient.getOkHttpClient();
        // 发送普通用户相关请求
        Request


build.gradle 是一个用于配置 Android 项目构建过程的重要文件,其中包含了项目的各种配置信息,例如依赖库、插件、版本号等。一般来说,Android 项目中会存在两个 build.gradle 文件:一个是项目级别的 build.gradle 文件,位于项目根目录下;另一个是模块级别的 build.gradle 文件,位于每个模块(如 app 模块)的目录下。 以下是一个简单的示例,展示了一个项目级别 build.gradle 文件中可能包含的内容:

gradleCopy code
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.0'
        // 添加其他插件
    }
}
allprojects {
    repositories {
        google()
        jcenter()
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}

在这个示例中,buildscript 部分定义了构建脚本的配置,包括使用的仓库和依赖的插件。allprojects 部分定义了所有项目都需要使用的仓库配置。task clean 部分定义了一个用于清理构建目录的任务。 对于模块级别的 build.gradle 文件,一般会包含应用插件的引入、依赖库的配置以及一些特定于模块的设置。以下是一个示例:

gradleCopy code
apply plugin: 'com.android.application'
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"
    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.4.0'
    // 其他依赖库
}

在这个示例中,apply plugin: 'com.android.application' 引入了应用插件,标识这是一个 Android 应用项目。android 配置块用于配置 Android 构建设置,包括编译版本、应用 ID、最低 SDK 版本等。dependencies 部分定义了项目依赖的库,例如支持库和第三方库。

3. 总结

通过设置拦截器,我们可以在 Android 应用程序中方便地拦截部分接口的网络请求,并对其进行统一处理。这种方式能够提高代码的可维护性和扩展性,同时也能够降低重复代码的编写量,是 Android 开发中常用的技巧之一。