美文网首页安卓开发Android开发经验谈安卓开发
打印完整的okhttp网络请求和响应消息

打印完整的okhttp网络请求和响应消息

作者: 蓝不蓝编程 | 来源:发表于2018-11-30 11:15 被阅读0次

    背景

    开发中,有时需要核对接口请求和响应参数,需要看到详细的接口调用。本来可以通过Facebook Stetho来监控接口的,但是受限于网络,导致调测界面打不开,所以只要寻求其他方案。

    解决方案

    通过okhttp添加拦截器,打印接口调用日志。

    1. 添加依赖
      implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
    2. 添加拦截器
      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)
    
    1. 打印出的日志样例:


      image.png
    1. 如果想要格式化输出的消息格式,可以参考《利用logger打印完整的okhttp网络请求和响应日志

    安卓开发技术分享: https://www.jianshu.com/p/442339952f26

    相关文章

      网友评论

        本文标题:打印完整的okhttp网络请求和响应消息

        本文链接:https://www.haomeiwen.com/subject/etwccqtx.html