您的位置:首页 > 理论基础 > 计算机网络

OkHttp:拦截器之网络请求Log

2017-12-01 11:27 260 查看
主要用来日志输出网络请求的参数及回调的实体类信息:

最近研究了Retrofit框架 ,准备接入项目中 ,发现网络请求没有任何参数提示,后来想到使用拦截器,打印rul和参数及实体类的回调。直接上代码吧

public class MyInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
printRequestMessage(request);
Response response = chain.proceed(request);
printResponseMessage(response);
return response;

}
/**
* 打印请求消息
*
* @param request 请求的对象
*/
private void printRequestMessage(Request request) {
if (request == null) {
return;
}
Logger.d("Url   : " + request.url().url().toString());
//        Logger.d("Method: " + request.method());
//        Logger.d("Heads : " + request.headers());
RequestBody requestBody = request.body();
if (requestBody == null) {
return;
}
try {
Buffer bufferedSink = new Buffer();
requestBody.writeTo(bufferedSink);
Charset charset = requestBody.contentType().charset();
charset = charset == null ? Charset.forName("utf-8") : charset;
Logger.d("Params: " + bufferedSink.readString(charset));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 打印返回消息
*
* @param response 返回的对象
*/
private void printResponseMessage(Response response) {
if (response == null || !response.isSuccessful()) {
return;
}
ResponseBody responseBody = response.body();
long contentLength = responseBody.contentLength();
BufferedSource source = responseBody.source();
try {
source.request(Long.MAX_VALUE); // Buffer the entire body.
} catch (IOException e) {
e.printStackTrace();
}
Buffer buffer = source.buffer();
Charset charset = UTF_8;
MediaType contentType = responseBody.contentType();
if (contentType != null) {
charset = contentType.charset();
}
if (contentLength != 0) {
String result = buffer.clone().readString(charset);
Logger.json( result);
}
}
}


然后直接在okhttp上面添加拦截器

// 配置 client
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new MyInterceptor())                // 设置拦截器
.retryOnConnectionFailure(true)             // 是否重试
.connectTimeout(5, TimeUnit.SECONDS)        // 连接超时事件
.readTimeout(5, TimeUnit.SECONDS)           // 读取超时时间
//                .addNetworkInterceptor(mTokenInterceptor)   // 自动附加 token
//                .authenticator(mAuthenticator)              // 认证失败自动刷新token
.build();
// 配置 Retrofit
mRetrofit = new Retrofit.Builder()
.baseUrl(Api.BASE_URL)                         // 设置 base url
.client(client)                                     // 设置 client
. addCallAdapterFactory(RxJavaCallAdapterFactory.create())//添加Rxjava使用
.addConverterFactory(GsonConverterFactory.create()) // 设置 Json 转换工具
.build();


日志显示可以根据Debug和release版本是否显示日志

/**
* 初始化日志库的管理
* @param context
*/
private static void initLogger(@NonNull Context context) {
// 在 debug 模式输出日志, release 模式自动移除
if (DebugUtil.isInDebug(context)) {
Logger.init("MyProject").logLevel(LogLevel.FULL);
} else {
Logger.init("MyProject").logLevel(LogLevel.NONE);
}
}

/**
* 判断当前应用是否是debug状态
*/
public class DebugUtil {
/**
* 判断是否是debug状态
*/

public static boolean isInDebug(Context context) {
try {
ApplicationInfo info = context.getApplicationInfo();
return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;

} catch (Exception e) {
return false;
}
}
}


最后附上效果图吧

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络 interceptor okhttp3