最近在使用Retrofit时,因为想把请求报文与响应报文的具体内容打到Monitor中,以便于与服务器进行联调。现在进行总结一下
- 使用开源Log管理工具,在Studio中添加如下依赖。
compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'
然后在网络基类中添加如下代码(前提是使用okhttp 或是 retrofit)
// Log信息拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
//设置日志打印级别
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
//将拦截器添加到ok中
builder.addInterceptor(loggingInterceptor);
只需要这三行代码就可实现日志的打印。关于这种方式,经过测试会出现在有些手机上无法打印Log的情况,需要在手机的开发者应用中进行设置。关于打印的格式如果我们不重写的情况下格式是比较乱的,如果想对格式控制一下可以用如下方式
//在HttpLoggingInterceptor的构造方法内传入一个Logger对象,并重写它的log方法
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
//可在该方法中对message进行处理打印
Log.e(Tag,message)
}
});
- 第二中方法是可以自定义个拦截器。上代码
/**
* 日志拦截器
*/
private static final Interceptor mLoggingInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();//请求发起的时间
Log.e("Interceptor", String.format("发送请求 %s on %s%n%s", request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();//收到响应的时间
//这里不能直接使用response.body().string()的方式输出日志
//因为response.body().string()之后,response中的流会被关闭,程序会报错,我们需要创建出一个新的response给应用层处理
ResponseBody responseBody = response.peekBody(1024 * 1024);
printLog("接受响应", responseBody.string());
return response;
}
};
下面为printlog方法的代码
/**
* 三个参数 Tag就是log中的tag,msg为具体信息
*/
public static void printLog(String tag, String msg) {
String message = null;
try {//需判断json是什么格式
if (msg.startsWith("{")) {
JSONObject jsonObject = new JSONObject(msg);
message = jsonObject.toString(4);//最重要的方法,就一行,返回格式化的json字符串,其中的数字4是缩进字符数
} else if (msg.startsWith("[")) {
JSONArray jsonArray = new JSONArray(msg);
message = jsonArray.toString(4);
} else {
message = msg;
}
} catch (JSONException e) {
message = msg;
}
String[] lines = message.split(LINE_SEPARATOR);
//此处也可以画分割线
//log.e(tag,"----------------------------------------------")
for (String line : lines) {
Log.d(tag, "|" + line);
}
//log.e(tag,"----------------------------------------------")
}
最后记的将自定义的Interceptor 添加到okhttp中,就可实现日志的打印。
以上就是所知的两种方式,如有错误,请多多指正。