okHttp详细日志打印

okHttp详细日志打印

本文简单介绍下使用okHttp后如何打印详细日志的简单完成。

我们使用okHttp、Retrofit来请求网络都是okHttp的基础类来进行网络请求的。

OkHttp也提供了一个网络拦截器okhttp-logging-interceptor,

通过它能拦截okhttp网络请求和响应所有相关信息(请求行、请求头、请求体、响应行、响应行、响应头、响应体)。

OkHttp的官网地址:https://github.com/square/okhttp

下面是使用日志拦截的过程:

一.依赖拦截日志地址

compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'

大家如果不能依赖,可以用我后面Demo下的jar包,由于公司环境原因,我是很多依赖不能使用的!

二.定义拦截器中的网络日志工具

依赖拦截日志地址,后就能识别HttpLoggingInterceptor。

之后定义一个要打印日志的类。


public class HttpLogger implements HttpLoggingInterceptor.Logger {
        @Override
        public void log(String message) {
            Log.d("HttpLogInfo", message);//okHttp的详细日志会打印出来
        }
    }

三.创建日志对象,并且放到okHttp请求对象中

    HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor(new HttpLogger());//创建拦截对象

        logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);//这一句一定要记得写,否则没有数据输出

    //网络请求对象
        OkHttpClient client = new OkHttpClient.Builder()
                .sslSocketFactory(createSSLSocketFactory())
                .hostnameVerifier(new TrustAllHostnameVerifier())
                .connectionPool(new ConnectionPool(8, 10, TimeUnit.MINUTES))
                .readTimeout(600, TimeUnit.SECONDS)
                .addNetworkInterceptor(logInterceptor)  //设置打印拦截日志
//                .addInterceptor(new LogInterceptor())  //自定义的拦截日志,拦截简单东西用,后面会有介绍 
                .build();

下面是拦截自己Post请求的一个示例日志:

可以看到里面打印了很多详细的信息,比如请求地址,请求方式,请求头,返回的数据内容等等。

这里提供一下我运行demo的代码,里面有三个目前最新的jar包:okhttp、okio、logging-interceptor

示例代码有get、post的请求示例,还有一段跳过SSL证书校验的代码。

地址:https://download.csdn.net/download/wenzhi20102321/10536033

其他:

这里说一下其实简单日志拦截是可以自己写的,代码不多。

后面看了下logging-interceptor-xx.jar这个jar包里面其实就是一个类!代码有三百多行。

如果不想导入拦截日志的jar包可以复制okHttp项目中这个类的的代码进入项目就可以实现日志拦截了。

https://github.com/square/okhttp/blob/master/okhttp-logging-interceptor/src/main/java/okhttp3/logging/HttpLoggingInterceptor.java

这里给大家分享一个简单的日志拦截的代码类LogInterceptor :

package com.liwenzhi.okhttp.okhttp;

import android.util.Log;

import java.io.IOException;

import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.Request;

/**
 *  日志拦截
 */

public class LogInterceptor implements Interceptor {

    public static String TAG = "LogInterceptor";

    @Override
    public okhttp3.Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        long startTime = System.currentTimeMillis();
        okhttp3.Response response = chain.proceed(chain.request());
        long endTime = System.currentTimeMillis();
        long duration=endTime-startTime;
        okhttp3.MediaType mediaType = response.body().contentType();
        String content = response.body().string();
        Log.d(TAG,"\n");
        Log.d(TAG,"----------Start----------------");
        Log.d(TAG, "| "+request.toString());
        String method=request.method();
        if("POST".equals(method)){
            StringBuilder sb = new StringBuilder();
            if (request.body() instanceof FormBody) {
                FormBody body = (FormBody) request.body();
                for (int i = 0; i < body.size(); i++) {
                    sb.append(body.encodedName(i) + "=" + body.encodedValue(i) + ",");
                }
                sb.delete(sb.length() - 1, sb.length());
                Log.d(TAG, "| RequestParams:{"+sb.toString()+"}");
            }
        }
        Log.d(TAG, "| Response:" + content);
        Log.d(TAG,"----------End:"+duration+"毫秒----------");
        return response.newBuilder()
                .body(okhttp3.ResponseBody.create(mediaType, content))
                .build();
    }
}

这个类会打印一些请求的方法头和返回的数据,还有请求使用的时间。并且这个类是不需要依赖的。

这个类的使用在上面使用步骤第三步有介绍(注释的部分)。

这个工具类打印出来的日志简单明了。在上面那个图片中也有这个简单工具类的打印start—>end

共勉:生命中有些东西是值得用一生去珍惜爱护的。

你可能感兴趣的:(android,Android网络,网络框架,Android,OkhttpDemo)