Android:如何拦截java.net.HttpURLConnection网络请求?求实现方案
嘿,这个问题我太熟了!要拦截java.net.HttpURLConnection发起的请求,其实可以借OkHttp的东风搞定——OkHttp提供了一套机制,能把默认的HttpURLConnection底层实现替换成自己的,这样就能顺理成章用上OkHttp的拦截器体系了。下面给你一步步拆解具体实现:
第一步:引入OkHttp依赖
首先得把OkHttp加到你的项目里,在Module级别的build.gradle(或者build.gradle.kts)的依赖块里加上:
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
(版本号可以根据OkHttp的最新稳定版调整)
第二步:替换默认的HttpURLConnection实现
OkHttp提供了OkUrlFactory,我们可以用它来接管HttpURLConnection的创建逻辑。注意:这个替换操作只能执行一次,所以最好放在你的自定义Application类的onCreate()方法里初始化,确保在所有网络请求之前完成。
代码示例:
import android.app.Application; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import java.net.URL; import okhttp3.OkUrlFactory; public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); // 1. 创建OkHttpClient实例,并添加自定义拦截器 OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(new CustomRequestInterceptor()) // 这里加你的自定义拦截器 .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) // 可选:添加日志拦截器方便调试 .build(); // 2. 替换默认的URLStreamHandlerFactory,让HttpURLConnection用OkHttp的实现 OkUrlFactory okUrlFactory = new OkUrlFactory(okHttpClient); URL.setURLStreamHandlerFactory(okUrlFactory); } }
别忘了在AndroidManifest.xml里把你的自定义Application配置上:
<application android:name=".MyApp" ...> ... </application>
第三步:实现自定义拦截器
接下来写你的拦截器逻辑,比如修改请求头、打印请求信息、拦截响应数据等等。这里举个简单的例子,拦截并打印请求和响应:
import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import java.io.IOException; public class CustomRequestInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { // 拦截请求,获取原始请求对象 Request originalRequest = chain.request(); // 这里可以修改请求,比如添加自定义Header Request modifiedRequest = originalRequest.newBuilder() .addHeader("X-Custom-Header", "My-Interceptor-Test") .build(); // 打印请求信息(调试用) System.out.println("拦截到请求:" + modifiedRequest.url()); System.out.println("请求Header:" + modifiedRequest.headers()); // 继续执行请求,获取响应 Response response = chain.proceed(modifiedRequest); // 拦截响应,这里可以读取响应内容、修改响应等 System.out.println("收到响应:" + response.code()); System.out.println("响应Header:" + response.headers()); return response; } }
一些注意事项
- 初始化时机:
URL.setURLStreamHandlerFactory只能调用一次,所以一定要在Application的onCreate里执行,别在其他地方重复调用。 - Android 9+ 网络配置:如果你的请求是明文HTTP(非HTTPS),需要在
AndroidManifest.xml的<application>标签里添加android:usesCleartextTraffic="true",或者配置网络安全配置文件。 - 拦截器的顺序:OkHttp的拦截器分为应用拦截器和网络拦截器,上面用的
addInterceptor()是应用拦截器,会在请求发起前和响应返回后被调用;如果需要更底层的拦截(比如处理重定向、重试),可以用addNetworkInterceptor()。
这样一来,不管是你自己写的new HttpURLConnection(),还是第三方库用HttpURLConnection发起的请求,都会被OkHttp的拦截器捕获到啦!
内容的提问来源于stack exchange,提问作者Sheela
相关产品推荐
相关产品推荐

