OkHttp:拦截器之网络请求Log

来源:互联网 发布:json.dump 格式化输出 编辑:程序博客网 时间:2024/06/05 12:42

主要用来日志输出网络请求的参数及回调的实体类信息:
最近研究了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;        }    }}

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

原创粉丝点击