本文简单介绍下使用okHttp后如何打印详细日志的简单完成。
我们使用okHttp、Retrofit来请求网络都是okHttp的基础类来进行网络请求的。
OkHttp也提供了一个网络拦截器okhttp-logging-interceptor,
通过它能拦截okhttp网络请求和响应所有相关信息(请求行、请求头、请求体、响应行、响应行、响应头、响应体)。
OkHttp的官网地址:https://github.com/square/okhttp
下面是使用日志拦截的过程:
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
大家如果不能依赖,可以用我后面Demo下的jar包,由于公司环境原因,我是很多依赖不能使用的!
依赖拦截日志地址,后就能识别HttpLoggingInterceptor。
之后定义一个要打印日志的类。
public class HttpLogger implements HttpLoggingInterceptor.Logger {
@Override
public void log(String message) {
Log.d("HttpLogInfo", message);//okHttp的详细日志会打印出来
}
}
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor(new HttpLogger());//创建拦截对象
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);//这一句一定要记得写,否则没有数据输出
//网络请求对象
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(createSSLSocketFactory())
.hostnameVerifier(new TrustAllHostnameVerifier())
.connectionPool(new ConnectionPool(8, 10, TimeUnit.MINUTES))
.readTimeout(600, TimeUnit.SECONDS)
.addNetworkInterceptor(logInterceptor) //设置打印拦截日志
// .addInterceptor(new LogInterceptor()) //自定义的拦截日志,拦截简单东西用,后面会有介绍
.build();
可以看到里面打印了很多详细的信息,比如请求地址,请求方式,请求头,返回的数据内容等等。
这里提供一下我运行demo的代码,里面有三个目前最新的jar包:okhttp、okio、logging-interceptor
示例代码有get、post的请求示例,还有一段跳过SSL证书校验的代码。
地址:https://download.csdn.net/download/wenzhi20102321/10536033
这里说一下其实简单日志拦截是可以自己写的,代码不多。
后面看了下logging-interceptor-xx.jar这个jar包里面其实就是一个类!代码有三百多行。
如果不想导入拦截日志的jar包可以复制okHttp项目中这个类的的代码进入项目就可以实现日志拦截了。
https://github.com/square/okhttp/blob/master/okhttp-logging-interceptor/src/main/java/okhttp3/logging/HttpLoggingInterceptor.java
package com.liwenzhi.okhttp.okhttp;
import android.util.Log;
import java.io.IOException;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.Request;
/**
* 日志拦截
*/
public class LogInterceptor implements Interceptor {
public static String TAG = "LogInterceptor";
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long startTime = System.currentTimeMillis();
okhttp3.Response response = chain.proceed(chain.request());
long endTime = System.currentTimeMillis();
long duration=endTime-startTime;
okhttp3.MediaType mediaType = response.body().contentType();
String content = response.body().string();
Log.d(TAG,"\n");
Log.d(TAG,"----------Start----------------");
Log.d(TAG, "| "+request.toString());
String method=request.method();
if("POST".equals(method)){
StringBuilder sb = new StringBuilder();
if (request.body() instanceof FormBody) {
FormBody body = (FormBody) request.body();
for (int i = 0; i < body.size(); i++) {
sb.append(body.encodedName(i) + "=" + body.encodedValue(i) + ",");
}
sb.delete(sb.length() - 1, sb.length());
Log.d(TAG, "| RequestParams:{"+sb.toString()+"}");
}
}
Log.d(TAG, "| Response:" + content);
Log.d(TAG,"----------End:"+duration+"毫秒----------");
return response.newBuilder()
.body(okhttp3.ResponseBody.create(mediaType, content))
.build();
}
}
这个类会打印一些请求的方法头和返回的数据,还有请求使用的时间。并且这个类是不需要依赖的。
这个类的使用在上面使用步骤第三步有介绍(注释的部分)。
这个工具类打印出来的日志简单明了。在上面那个图片中也有这个简单工具类的打印start—>end