一、前言:
OKhttp的拦截器有很多用处,今天分享一个利用它实现对请求响应信息的一个日志信息打印的封装。

图片.png
二、代码:
/**
* @author by lyy on 2019/9/12.
* okhttp 拦截器,主要功能为添加请求头,统一记录日志等等统一行为
*/
public class HttpInterceptor implements Interceptor {
private static final Charset UTF8 = Charset.forName("UTF-8");
private static String requestValue;
private static String reponseValue;
@Override
public Response intercept(Chain chain) throws IOException {
//请求token
String token = SPUtils.getInstance(SPConstant.TOKEN).getString(SPConstant.TOKEN);
Request request = chain.request();
String deviceId = BaseApplication.getDeviceId();
//添加请求头
Request updateRequest = request.newBuilder().header("token", token)
.addHeader("deviceID", deviceId)
.addHeader("deviceType", "Android")
.addHeader("screenSize", ScreenUtils.getAppScreenWidth() + "x" + ScreenUtils.getAppScreenHeight())
.addHeader("version", BuildConfig.VERSION_NAME)
.build();
Response response = chain.proceed(updateRequest);
if (BuildConfig.DEBUG) {
//添加打印服务器返回的数据
ResponseBody responseBody = response.body();
long contentLength = responseBody.contentLength();
BufferedSource source = responseBody.source();
source.request(Integer.MAX_VALUE); // Buffer the entire body.
Buffer buffer = source.buffer();
//+ "\n" + "返回数据:" + getResponseInfo(response)
Log.d("return", "请求头:" + updateRequest.headers() + "\n" + "请求参数:" + response.toString() + "\n" + "主体:" + getRequestInfo(request));
requestValue = response.toString();
reponseValue = getResponseInfo(response);
//返回参数
String value = getResponseInfo(response);
if (value.length() > 4000) {
// integer division
int chunkCount = value.length() / 4000;
for (int i = 0; i <= chunkCount; i++) {
int max = 4000 * (i + 1);
if (max >= value.length()) {
Log.d("return", "chunk " + i + " of " + chunkCount + ":" + value.substring(4000 * i));
} else {
//"chunk " + i + " of " + chunkCount + ":" +
Log.d("return", "chunk " + i + " of " + chunkCount + ":" + value.substring(4000 * i, max));
}
}
} else {
Log.d("return", value);
}
}
return response;
}
/**
* @return
*/
public static String getRequestParameter() {
return requestValue;
}
public static String getResponseParameter() {
return reponseValue;
}
/**
* 打印请求消息
*
* @param request 请求的对象
*/
private String getRequestInfo(Request request) {
String str = "";
if (request == null) {
return str;
}
RequestBody requestBody = request.body();
if (requestBody == null) {
return str;
}
try {
Buffer bufferedSink = new Buffer();
requestBody.writeTo(bufferedSink);
Charset charset = Charset.forName("utf-8");
str = bufferedSink.readString(charset);
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
/**
* 打印返回消息
*
* @param response 返回的对象
*/
private String getResponseInfo(Response response) {
String str = "";
if (response == null || !response.isSuccessful()) {
return str;
}
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 = Charset.forName("utf-8");
if (contentLength != 0) {
str = buffer.clone().readString(charset);
}
return str;
}
}
