1、Retrofit2中使用自定义的日志拦截器:
@Override
public void okHttpClient(OkHttpClient.Builder okHttpClient) {
okHttpClient.connectTimeout(5000, TimeUnit.MILLISECONDS)
.writeTimeout(60000, TimeUnit.MILLISECONDS)
.readTimeout(60000, TimeUnit.MILLISECONDS)
.addInterceptor(chain -> {
Request.Builder builder = chain.request().newBuilder();
AccountBean bean = MainApplication.getInstance().getAccountBean();
builder.addHeader("user_id", bean.getUserCardNum());//身份证号码
return chain.proceed(builder.build());
});
okHttpClient.addInterceptor(new HttpLogReportInterceptor());//统一日志拦截器
}
2、HttpLogReportInterceptor.java 源码:
public class HttpLogReportInterceptor implements Interceptor {
private final String TAG = this.getClass().getSimpleName();
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
StringBuilder sb = new StringBuilder();
String url = request.url().toString();
if (!TextUtils.isEmpty(url) && url.endsWith("api/log/save")) {
return chain.proceed(request);
}
sb.append("URL: ").append(url).append("n");
sb.append("Request: ").append(getRequestParams(request)).append("n");
Response originalResponse;
try {
originalResponse = chain.proceed(request);
} catch (Exception e) {
sb.append("Http Error: ").append(e.getMessage());
throw e;
}
ResponseBody responseBody = originalResponse.body();
//打印响应结果
String bodyString = "";
if (responseBody != null && HttpContentTypeUtil.isParseable(responseBody.contentType())) {
bodyString = getResponseContent(originalResponse);
}
sb.append("Response: ").append(bodyString);
String httpInfo = sb.toString();
LegoLog.d("统一日志拦截的内容:" + httpInfo);
reportHttpLog(httpInfo, url);
return originalResponse;
}
private void reportHttpLog(String httpInfo, String url) {
Log.d(TAG,"此处调用日志上传接口");
}
private String getRequestParams(Request request) throws IOException {
if (request.body() != null && HttpContentTypeUtil.isParseable(request.body().contentType())) {
return parseParams(request);
}
return "";
}
private static String parseParams(Request request) throws UnsupportedEncodingException {
try {
RequestBody body = request.newBuilder().build().body();
if (body == null) return "";
Buffer requestBuffer = new Buffer();
body.writeTo(requestBuffer);
Charset charset = Charset.forName("UTF-8");
MediaType contentType = body.contentType();
if (contentType != null) {
charset = contentType.charset(charset);
}
String text = requestBuffer.readString(charset);
if (contentType != null && !"json".equals(contentType.subtype())) {
text = URLDecoder.decode(text, convertCharset(charset));
}
return TextUtil.jsonFormat(text);
} catch (IOException e) {
e.printStackTrace();
return "{"error": "" + e.getMessage() + ""}";
}
}
private String getResponseContent(Response response) throws IOException {
try {
//读取服务器返回的结果
ResponseBody responseBody = response.newBuilder().build().body();
BufferedSource source = responseBody.source();
source.request(Long.MAX_VALUE); // Buffer the entire body.
Buffer buffer = source.buffer();
//获取content的压缩类型
String encoding = response
.headers()
.get("Content-Encoding");
Buffer clone = buffer.clone();
//解析response content
return parseContent(responseBody, encoding, clone);
} catch (IOException e) {
LegoLog.w(e.getMessage());
return "{"error": "" + e.getMessage() + ""}";
}
}
private String parseContent(ResponseBody responseBody, String encoding, Buffer clone) {
Charset charset = StandardCharsets.UTF_8;
MediaType contentType = responseBody.contentType();
if (contentType != null) {
charset = contentType.charset(charset);
}
if (encoding != null && encoding.equalsIgnoreCase("gzip")) {//content使用gzip压缩
return ZipUtil.decompressForGzip(clone.readByteArray(), convertCharset(charset));//解压
} else if (encoding != null && encoding.equalsIgnoreCase("zlib")) {//content使用zlib压缩
return ZipUtil.decompressToStringForZlib(clone.readByteArray(), convertCharset(charset));//解压
} else {//content没有被压缩
return clone.readString(charset);
}
}
private static String convertCharset(Charset charset) {
String s = charset.toString();
int i = s.indexOf("[");
if (i == -1)
return s;
return s.substring(i + 1, s.length() - 1);
}
}



