Android使用拦截器打印网络请求、响应日志信息

一、前言:

OKhttp的拦截器有很多用处,今天分享一个利用它实现对请求响应信息的一个日志信息打印的封装。

图片.png

二、代码:


/**
 * @author by lyy on 2019/9/12.
 * okhttp  拦截器,主要功能为添加请求头,统一记录日志等等统一行为
 */
public class HttpInterceptor implements Interceptor {
    private static final Charset UTF8 = Charset.forName("UTF-8");

    private static String requestValue;
    private static String reponseValue;

    @Override
    public Response intercept(Chain chain) throws IOException {
        //请求token
        String token = SPUtils.getInstance(SPConstant.TOKEN).getString(SPConstant.TOKEN);

        Request request = chain.request();

        String deviceId = BaseApplication.getDeviceId();
        //添加请求头
        Request updateRequest = request.newBuilder().header("token", token)
                .addHeader("deviceID", deviceId)
                .addHeader("deviceType", "Android")
                .addHeader("screenSize", ScreenUtils.getAppScreenWidth() + "x" + ScreenUtils.getAppScreenHeight())
                .addHeader("version", BuildConfig.VERSION_NAME)
                .build();
        Response response = chain.proceed(updateRequest);

        if (BuildConfig.DEBUG) {
            //添加打印服务器返回的数据
            ResponseBody responseBody = response.body();
            long contentLength = responseBody.contentLength();
            BufferedSource source = responseBody.source();
            source.request(Integer.MAX_VALUE); // Buffer the entire body.
            Buffer buffer = source.buffer();
            //+ "\n" + "返回数据:" + getResponseInfo(response)
            Log.d("return", "请求头:" + updateRequest.headers() + "\n" + "请求参数:" + response.toString() + "\n" + "主体:" + getRequestInfo(request));
            requestValue = response.toString();
            reponseValue = getResponseInfo(response);
            //返回参数
            String value = getResponseInfo(response);
            if (value.length() > 4000) {
                // integer division
                int chunkCount = value.length() / 4000;
                for (int i = 0; i <= chunkCount; i++) {
                    int max = 4000 * (i + 1);
                    if (max >= value.length()) {
                        Log.d("return", "chunk " + i + " of " + chunkCount + ":" + value.substring(4000 * i));
                    } else {
                        //"chunk " + i + " of " + chunkCount + ":" +
                        Log.d("return", "chunk " + i + " of " + chunkCount + ":" + value.substring(4000 * i, max));
                    }
                }
            } else {
                Log.d("return", value);
            }
        }
        return response;
    }

    /**
     * @return
     */
    public static String getRequestParameter() {
        return requestValue;
    }

    public static String getResponseParameter() {
        return reponseValue;
    }

    /**
     * 打印请求消息
     *
     * @param request 请求的对象
     */
    private String getRequestInfo(Request request) {
        String str = "";
        if (request == null) {
            return str;
        }
        RequestBody requestBody = request.body();
        if (requestBody == null) {
            return str;
        }
        try {
            Buffer bufferedSink = new Buffer();
            requestBody.writeTo(bufferedSink);
            Charset charset = Charset.forName("utf-8");
            str = bufferedSink.readString(charset);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }
    /**
     * 打印返回消息
     *
     * @param response 返回的对象
     */
    private String getResponseInfo(Response response) {
        String str = "";
        if (response == null || !response.isSuccessful()) {
            return str;
        }
        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 = Charset.forName("utf-8");
        if (contentLength != 0) {
            str = buffer.clone().readString(charset);
        }
        return str;
    }
}

参考链接:https://blog.csdn.net/Ever69/article/details/99647123

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。