在 OkHttp 拦截器中修改请求头或请求体是比较常见的操作,下面为你分别介绍修改请求头和请求体的方法及示例代码。
修改请求头
在拦截器中修改请求头相对简单,你可以通过 Request.Builder
来创建一个新的请求对象,并添加或修改请求头。以下是一个示例代码:
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
// 自定义请求头拦截器
public class HeaderModifyingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
// 获取原始请求
Request originalRequest = chain.request();
// 创建一个新的请求构建器
Request.Builder requestBuilder = originalRequest.newBuilder();
// 添加或修改请求头
requestBuilder.header("Authorization", "Bearer your_token");
requestBuilder.header("Custom-Header", "Custom-Value");
// 构建新的请求
Request newRequest = requestBuilder.build();
// 继续处理新的请求
return chain.proceed(newRequest);
}
}
在上述代码中,HeaderModifyingInterceptor
类实现了 Interceptor
接口。在 intercept
方法里,首先获取原始请求,接着使用 Request.Builder
创建一个新的请求构建器。通过 header
方法添加或修改请求头,最后构建新的请求并传递给下一个拦截器。
修改请求体
修改请求体相对复杂一些,因为请求体可能包含不同类型的数据(如 JSON、表单数据等)。以下是一个修改 JSON 请求体的示例代码:
import okhttp3.*;
import java.io.IOException;
// 自定义请求体拦截器
public class BodyModifyingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
// 获取原始请求
Request originalRequest = chain.request();
// 检查请求是否有请求体
if (originalRequest.body() != null && originalRequest.body() instanceof FormBody) {
// 假设请求体是表单数据,创建一个新的表单构建器
FormBody originalFormBody = (FormBody) originalRequest.body();
FormBody.Builder newFormBodyBuilder = new FormBody.Builder();
// 遍历原始表单数据
for (int i = 0; i < originalFormBody.size(); i++) {
String name = originalFormBody.name(i);
String value = originalFormBody.value(i);
// 可以在这里修改表单数据
if ("key_to_modify".equals(name)) {
value = "new_value";
}
newFormBodyBuilder.add(name, value);
}
// 构建新的表单请求体
FormBody newFormBody = newFormBodyBuilder.build();
// 创建一个新的请求构建器,并设置新的请求体
Request.Builder requestBuilder = originalRequest.newBuilder()
.method(originalRequest.method(), newFormBody);
// 构建新的请求
Request newRequest = requestBuilder.build();
// 继续处理新的请求
return chain.proceed(newRequest);
}
// 如果请求体不是表单数据,直接继续处理原始请求
return chain.proceed(originalRequest);
}
}
在上述代码中,BodyModifyingInterceptor
类实现了 Interceptor
接口。在 intercept
方法里,首先获取原始请求,然后检查请求体是否为表单数据。如果是表单数据,创建一个新的表单构建器,遍历原始表单数据,根据需要修改数据,最后构建新的表单请求体和新的请求。如果请求体不是表单数据,则直接继续处理原始请求。
使用自定义拦截器
以下是如何在 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 HeaderModifyingInterceptor())
.addInterceptor(new BodyModifyingInterceptor())
.build();
// 创建请求
Request request = new Request.Builder()
.url("https://www.example.com")
.post(new FormBody.Builder()
.add("key1", "value1")
.add("key_to_modify", "old_value")
.build())
.build();
// 发起请求
Response response = client.newCall(request).execute();
// 处理响应
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.out.println("Request failed: " + response.code());
}
}
}
在上述代码中,创建了一个 OkHttpClient
实例,并添加了 HeaderModifyingInterceptor
和 BodyModifyingInterceptor
两个拦截器。然后创建一个包含表单数据的请求,并发起请求。最后根据响应结果进行相应的处理。