最近做项目中需要查看服务器返回的原始json格式数据,由于项目基于Retrofit/Rxjava网络协议框架,其返回值为Bean类型格式,于是便想写一个Intercept,对服务器返回的数据拦截并进行log显示,下面是自定义拦截器类
public class TestInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Response response = chain.proceed(original);
String content = response.body().string();
Log.i("jsonData", "intercept: "+content);
return response;
}
}
但是调用登录接口后,没有进行响应操作跳转到主页面,最后发现当我把String content = response.body().string()注释后,便会有响应操作,在网上查了string()方法,又查看了string()源码,发现
public final String string() throws IOException {
BufferedSource source = source();
try {
Charset charset = Util.bomAwareCharset(source, charset());
return source.readString(charset);
} finally {
Util.closeQuietly(source);
}
}
当string()方法执行完以后便会通过Util.closeQuietly(source)关掉流,使得拦截器返回的response对象null,于是将代码改为
public class TestInterceptor implements Interceptor {
private final String TAG = "jsonData";
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Response response = chain.proceed(original);
ResponseBody responsePeekBody = response.peekBody(1024 * 1024);
Log.i(TAG, "intercept: "+responsePeekBody.string());
return response;
}
}
然后
OkHttpClient.Builder okhttpClient = new OkHttpClient.Builder();
okhttpClient.addInterceptor(new TestInterceptor());
okhttpClient.build();
就可以了