public class HttpLogInterceptor implements Interceptor {
private static final String TAG = "HttpLogInterceptor";
public HttpLogInterceptor() {
}
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
//添加到责任链中
Request request = chain.request();
logForRequest(request);
Response response;
try {
response = chain.proceed(request);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
return logForResponse(response);
}
/**
* 打印响应日志
*
* @param response
* @return
*/
private Response logForResponse(Response response) {
Log.e(TAG, "\n********响应开始********");
Response.Builder builder = response.newBuilder();
Response clone = builder.build();
Log.d(TAG, "url:" + clone.request().url());
Log.d(TAG, "code:" + clone.code());
if (!TextUtils.isEmpty(clone.message())) {
Log.d(TAG, "message:" + clone.message());
}
Headers responseHeaders = response.request().headers();
Log.e(TAG, "\n请求头 ----> \n");
Log.d(TAG, responseHeaders.toString());
ResponseBody body = clone.body();
if (body != null) {
MediaType mediaType = body.contentType();
if (mediaType != null) {
if (isText(mediaType)) {
String resp = null;
try {
resp = body.string();
} catch (IOException e) {
e.printStackTrace();
}
String result = resp;
int segmentSize = 3 * 1024;
Log.e(TAG, "\n响应结果: ---->\n");
if (result.length() <= segmentSize) {// 长度小于等于限制直接打印
Log.d(TAG, result);
} else {
while (result.length() > segmentSize) {// 循环分段打印日志
String logContent = result.substring(0, segmentSize);
result = result.replace(logContent, "");
Log.d(TAG, logContent);
}
Log.d(TAG, result);
}
Log.e(TAG, "********响应结束********\n");
body = ResponseBody.create(mediaType, resp);
return response.newBuilder().body(body).build();
} else {
Log.e(TAG, "响应内容 : " + "发生错误-非文本类型");
}
}
}
Log.e(TAG, "********响应结束********");
return response;
}
private boolean isText(MediaType mediaType) {
if (mediaType.type() != null && (mediaType.type().equals("text") || mediaType.type().equals("application/json"))) {
return true;
}
if (mediaType.subtype() != null) {
if (mediaType.subtype().equals("json")
|| mediaType.subtype().equals("xml")
|| mediaType.subtype().equals("html")
|| mediaType.subtype().equals("webviewhtml")
|| mediaType.subtype().equals("x-www-form-urlencoded")) {
return true;
}
}
return false;
}
/**
* 打印请求日志
*
* @param request
*/
private void logForRequest(Request request) {
String url = request.url().toString();
Log.e(TAG, "\n========请求开始=======");
Log.d(TAG, "请求方式 : " + request.method());
Log.d(TAG, "url : " + url);
RequestBody requestBody = request.body();
if (requestBody != null) {
MediaType mediaType = requestBody.contentType();
if (mediaType != null) {
Log.d(TAG, "请求内容类别 : " + mediaType.toString());
if (isText(mediaType)) {
Log.d(TAG, "请求内容 : " + bodyToString(request));
} else {
Log.d(TAG, "请求内容 : " + " 无法识别。");
}
}
}
Log.e(TAG, "========请求结束=======\n");
}
private String bodyToString(Request request) {
Request req = request.newBuilder().build();
String urlSub = null;
Buffer buffer = new Buffer();
try {
req.body().writeTo(buffer);
String message = buffer.readUtf8();
urlSub = URLDecoder.decode(message, "utf-8");
} catch (IOException e) {
e.printStackTrace();
return "在解析请求内容时候发生了异常-非字符串";
}
return urlSub;
}
Okhttp自定义拦截器
最新推荐文章于 2024-07-27 17:56:15 发布