背景
开发中,有时需要核对接口请求和响应参数,需要看到详细的接口调用。本来可以通过Facebook Stetho来监控接口的,但是受限于网络,导致调测界面打不开,所以只要寻求其他方案。
解决方案
通过okhttp添加拦截器,打印接口调用日志。
添加依赖
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
添加拦截器
HttpLogInterceptor.java
import android.util.Log;import java.io.IOException;import java.nio.charset.Charset;import java.nio.charset.UnsupportedCharsetException;import java.util.concurrent.TimeUnit;import okhttp3.Interceptor;import okhttp3.MediaType;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;import okhttp3.ResponseBody;import okio.Buffer;import okio.BufferedSource;/** * okhttp 拦截器 */public class HttpLogInterceptor implements Interceptor { private static final String TAG = HttpLogInterceptor.class.getSimpleName(); private final Charset UTF8 = Charset.forName("UTF-8"); @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); RequestBody requestBody = request.body(); String body = null; if (requestBody != null) { Buffer buffer = new Buffer(); requestBody.writeTo(buffer); Charset charset = UTF8; MediaType contentType = requestBody.contentType(); if (contentType != null) { charset = contentType.charset(UTF8); } body = buffer.readString(charset); } Log.d(TAG, "发送请求: method:" + request.method() + "\nurl:" + request.url() + "\n请求头:" + request.headers() + "\n请求参数: " + body); long startNs = System.nanoTime(); Response response = chain.proceed(request); long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs); ResponseBody responseBody = response.body(); String rBody; BufferedSource source = responseBody.source(); source.request(Long.MAX_VALUE); Buffer buffer = source.buffer(); Charset charset = UTF8; MediaType contentType = responseBody.contentType(); if (contentType != null) { try { charset = contentType.charset(UTF8); } catch (UnsupportedCharsetException e) { e.printStackTrace(); } } rBody = buffer.clone().readString(charset); Log.d(TAG, "收到响应: code:" + response.code() + "\n请求url:" + response.request().url() + "\n请求body:" + body + "\nResponse: " + rBody); return response; } }
添加拦截器(该拦截器需要最后添加,否则其他对request、response做修改的Interceptor所导致的变更就无法打印出来的。):
Interceptor loggingInterceptor = new HttpLoggingInterceptor(); okBuilder.addInterceptor(loggingInterceptor)
打印出的日志样例:
作者:程序园中猿
链接:https://www.jianshu.com/p/045f13fa74d1