OkHttp:拦截器之网络请求Log

主要用来日志输出网络请求的参数及回调的实体类信息:
最近研究了Retrofit框架 ,准备接入项目中 ,发现网络请求没有任何参数提示,后来想到使用拦截器,打印rul和参数及实体类的回调。直接上代码吧

public class MyInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        printRequestMessage(request);
        Response response = chain.proceed(request);
        printResponseMessage(response);
        return response;

    }
    /**
     * 打印请求消息
     *
     * @param request 请求的对象
     */
    private void printRequestMessage(Request request) {
        if (request == null) {
            return;
        }
        Logger.d("Url   : " + request.url().url().toString());
//        Logger.d("Method: " + request.method());
//        Logger.d("Heads : " + request.headers());
        RequestBody requestBody = request.body();
        if (requestBody == null) {
            return;
        }
        try {
            Buffer bufferedSink = new Buffer();
            requestBody.writeTo(bufferedSink);
            Charset charset = requestBody.contentType().charset();
            charset = charset == null ? Charset.forName("utf-8") : charset;
            Logger.d("Params: " + bufferedSink.readString(charset));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 打印返回消息
     *
     * @param response 返回的对象
     */
    private void printResponseMessage(Response response) {
        if (response == null || !response.isSuccessful()) {
            return;
        }
        ResponseBody responseBody = response.body();
        long contentLength = responseBody.contentLength();
        BufferedSource source = responseBody.source();
        try {
            source.request(Long.MAX_VALUE); // Buffer the entire body.
        } catch (IOException e) {
            e.printStackTrace();
        }
        Buffer buffer = source.buffer();
        Charset charset = UTF_8;
        MediaType contentType = responseBody.contentType();
        if (contentType != null) {
            charset = contentType.charset();
        }
        if (contentLength != 0) {
            String result = buffer.clone().readString(charset);
            Logger.json( result);
        }
    }
}

然后直接在okhttp上面添加拦截器

  // 配置 client
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(new MyInterceptor())                // 设置拦截器
                .retryOnConnectionFailure(true)             // 是否重试
                .connectTimeout(5, TimeUnit.SECONDS)        // 连接超时事件
                .readTimeout(5, TimeUnit.SECONDS)           // 读取超时时间
//                .addNetworkInterceptor(mTokenInterceptor)   // 自动附加 token
//                .authenticator(mAuthenticator)              // 认证失败自动刷新token
                .build();
        // 配置 Retrofit
        mRetrofit = new Retrofit.Builder()
                .baseUrl(Api.BASE_URL)                         // 设置 base url
                .client(client)                                     // 设置 client
                . addCallAdapterFactory(RxJavaCallAdapterFactory.create())//添加Rxjava使用
                .addConverterFactory(GsonConverterFactory.create()) // 设置 Json 转换工具
                .build();

日志显示可以根据Debug和release版本是否显示日志

 /**
     * 初始化日志库的管理
     * @param context
     */
    private static void initLogger(@NonNull Context context) {
        // 在 debug 模式输出日志, release 模式自动移除
        if (DebugUtil.isInDebug(context)) {
            Logger.init("MyProject").logLevel(LogLevel.FULL);
        } else {
            Logger.init("MyProject").logLevel(LogLevel.NONE);
        }
    }

     /**
     * 判断当前应用是否是debug状态
     */
public class DebugUtil {
    /**
     * 判断是否是debug状态
     */

    public static boolean isInDebug(Context context) {
        try {
            ApplicationInfo info = context.getApplicationInfo();
            return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;

        } catch (Exception e) {
            return false;
        }
    }
}

最后附上效果图吧
这里写图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值