网络请求日志拦截器【直接可用】

废话不多说,直接上代码!

 

/**
 * Author : 马占柱
 * E-mail : mazhanzhu_3351@163.com
 * Time   : 2022/1/21 14:44
 * Desc   : 日志拦截器
 */
public class HttpLogging implements Interceptor {
    public static final String TAG = "HttpLoggingInterceptor";
    private static final Charset UTF8 = Charset.forName("UTF-8");
    private volatile HttpLogging.Level printLevel;
    private java.util.logging.Level colorLevel;
    private Logger logger;

    public HttpLogging(String tag) {
        this.printLevel = HttpLogging.Level.NONE;
        this.logger = Logger.getLogger(tag);
    }

    public void setPrintLevel(HttpLogging.Level level) {
        if (this.printLevel == null) {
            throw new NullPointerException("printLevel == null. Use Level.NONE instead.");
        } else {
            this.printLevel = level;
        }
    }

    public void setColorLevel(java.util.logging.Level level) {
        this.colorLevel = level;
    }

    private void log(String message) {
        this.logger.log(this.colorLevel, message);
    }

    public Response intercept(Chain chain) throws IOException {
        // FIXME: 2022/1/21 添加请求头的一种方式 如果不用的话,直接用Request request = chain.request();
        Request original = chain.request();
        Request.Builder requestBuilder = original.newBuilder()
                .header("platform", "platform")//平台
                .header("sysVersion", "sysVersion")//系统版本号
                .header("device", "device")//设备信息
                .header("screen", "screen")//屏幕大小
                .header("uuid", "uuid")//设备唯一码
                .header("version", "version")//app版本
                .header("apiVersion", "apiVersion")//api版本
                .header("token", "token")//令牌
                .header("channelId", "channelId")//渠道
                .header("networkType", "networkType");//网络类型
        Request request = requestBuilder.build();

        Response proceed = chain.proceed(request);
        if (this.printLevel == HttpLogging.Level.NONE) {
            return proceed;
        } else {
            this.logForRequest(request, chain.connection());
            long startNs = System.nanoTime();
            long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
            return this.logForResponse(proceed, tookMs);
        }
    }

    private void logForRequest(Request request, Connection connection) throws IOException {
        boolean logBody = this.printLevel == HttpLogging.Level.BODY;
        boolean logHeaders = this.printLevel == HttpLogging.Level.BODY || this.printLevel == HttpLogging.Level.HEADERS;
        RequestBody requestBody = request.body();
        boolean hasRequestBody = requestBody != null;
        Protocol protocol = connection != null ? connection.protocol() : Protocol.HTTP_1_1;

        try {
            String requestStartMessage = "--> " + request.method() + ' ' + request.url() + ' ' + protocol;
            this.log(requestStartMessage);
            if (logHeaders) {
                if (hasRequestBody) {
                    if (requestBody.contentType() != null) {
                        this.log("\tContent-Type: " + requestBody.contentType());
                    }

                    if (requestBody.contentLength() != -1L) {
                        this.log("\tContent-Length: " + requestBody.contentLength());
                    }
                }

                Headers headers = request.headers();
                int i = 0;

                for (int count = headers.size(); i < count; ++i) {
                    String name = headers.name(i);
                    if (!"Content-Type".equalsIgnoreCase(name) && !"Content-Length".equalsIgnoreCase(name)) {
                        this.log("\t" + name + ": " + headers.value(i));
                    }
                }

                this.log(" ");
                if (logBody && hasRequestBody) {
                    if (isPlaintext(requestBody.contentType())) {
                        this.bodyToString(request);
                    } else {
                        this.log("\tbody: maybe [binary body], omitted!");
                    }
                }
            }
        } catch (Exception var16) {

        } finally {
            this.log("--> END " + request.method());
        }

    }

    private Response logForResponse(Response response, long tookMs) {
        Builder builder = response.newBuilder();
        Response clone = builder.build();
        ResponseBody responseBody = clone.body();
        boolean logBody = this.printLevel == HttpLogging.Level.BODY;
        boolean logHeaders = this.printLevel == HttpLogging.Level.BODY || this.printLevel == HttpLogging.Level.HEADERS;

        try {
            this.log("<-- " + clone.code() + ' ' + clone.message() + ' ' + clone.request().url() + " (" + tookMs + "ms)");
            if (logHeaders) {
                Headers headers = clone.headers();
                int i = 0;

                for (int count = headers.size(); i < count; ++i) {
                    this.log("\t" + headers.name(i) + ": " + headers.value(i));
                }

                this.log(" ");
                if (logBody && HttpHeaders.hasBody(clone)) {
                    if (responseBody == null) {
                        Response var20 = response;
                        return var20;
                    }

                    if (isPlaintext(responseBody.contentType())) {
                        byte[] bytes = toByteArray(responseBody.byteStream());
                        MediaType contentType = responseBody.contentType();
                        String body = new String(bytes, getCharset(contentType));
                        this.log("\tbody:" + body);
                        responseBody = ResponseBody.create(responseBody.contentType(), bytes);
                        Response var13 = response.newBuilder().body(responseBody).build();
                        return var13;
                    }

                    this.log("\tbody: maybe [binary body], omitted!");
                }
            }
        } catch (Exception var17) {
            Log.e(TAG, "logForResponse: " + var17.toString());
        } finally {
            this.log("<-- END HTTP");
        }

        return response;
    }

    private static Charset getCharset(MediaType contentType) {
        Charset charset = contentType != null ? contentType.charset(UTF8) : UTF8;
        if (charset == null) {
            charset = UTF8;
        }

        return charset;
    }

    private static boolean isPlaintext(MediaType mediaType) {
        if (mediaType == null) {
            return false;
        } else if (mediaType.type() != null && mediaType.type().equals("text")) {
            return true;
        } else {
            String subtype = mediaType.subtype();
            if (subtype != null) {
                subtype = subtype.toLowerCase();
                if (subtype.contains("x-www-form-urlencoded") || subtype.contains("json") || subtype.contains("xml") || subtype.contains("html")) {
                    return true;
                }
            }

            return false;
        }
    }

    private void bodyToString(Request request) {
        try {
            Request copy = request.newBuilder().build();
            RequestBody body = copy.body();
            if (body == null) {
                return;
            }

            Buffer buffer = new Buffer();
            body.writeTo(buffer);
            Charset charset = getCharset(body.contentType());
            this.log("\tbody:" + buffer.readString(charset));
        } catch (Exception var6) {
            Log.e(TAG, "bodyToString: " + var6.toString());
        }
    }

    public static enum Level {
        NONE,
        BASIC,
        HEADERS,
        BODY;

        private Level() {
        }
    }

    private static byte[] toByteArray(InputStream input) throws IOException {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        write((InputStream) input, (OutputStream) output);
        output.close();
        return output.toByteArray();
    }

    private static void write(InputStream inputStream, OutputStream outputStream) throws IOException {
        byte[] buffer = new byte[4096];

        int len;
        while ((len = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, len);
        }
    }
}

 使用的时候如下:

//配置网络请求参数
    private OkHttpClient getHttpClient() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        HttpLogging interceptor = new HttpLogging("mzz");
        interceptor.setColorLevel(Level.INFO);
        if (BaseApp.isApkInDebug()) {//是否是Debug模式
            interceptor.setPrintLevel(HttpLogging.Level.BODY);
            Log_Ma.setIsShow(true);
            builder.readTimeout(180, TimeUnit.SECONDS);
            builder.writeTimeout(180, TimeUnit.SECONDS);
            builder.connectTimeout(180, TimeUnit.SECONDS);
        } else {
            interceptor.setPrintLevel(HttpLogging.Level.NONE);
            Log_Ma.setIsShow(false);
            builder.readTimeout(60, TimeUnit.SECONDS);
            builder.writeTimeout(60, TimeUnit.SECONDS);
            builder.connectTimeout(60, TimeUnit.SECONDS);
        }
        File cacheFile = new File(BaseApp.getContext().getCacheDir(), RESPONSE_CACHE_FILE);//缓存文件
        builder.cache(new Cache(cacheFile, RESPONSE_CACHE_SIZE))//设置用于读取和写入缓存的响应的响应缓存
                .sslSocketFactory(getSSLSocketFactory(), new CustomTrustManager())//信任所有https请求
                .hostnameVerifier(getHostnameVerifier())//设置用于确认响应证书应用于HTTPS连接请求的主机名的验证器。
                .cookieJar(new CookieJar() {

                    @Override
                    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                        map.put(url.toString(), cookies);
                    }

                    @Override
                    public List<Cookie> loadForRequest(HttpUrl url) {
                        List<Cookie> cookies = map.get(url.toString());
                        return cookies != null ? cookies : new ArrayList<>();
                    }
                })

                .addInterceptor(interceptor)//使用日志拦截器
                .proxy(Proxy.NO_PROXY);//不使用代理的模式

        OkHttpClient client = builder.build();
        return client;
    }

完整使用如下,我用的是Retrofit,可以直接使用我的网络工具类也行:

/**
 * Author : 马占柱
 * E-mail : mazhanzhu_3351@163.com
 * Time   : 2022/1/21 14:09
 * Desc   : 网络请求
 */
public class Http_Net {
    public static final String TAG = "";
    //使用volatile关键字保其可见性
    volatile private static Http_Net instance = null;
    private SimpleArrayMap<String, List<Cookie>> map = new SimpleArrayMap<>();

    private Http_Net() {
    }

    public static Http_Net getInstance() {
        try {
            if (instance == null) {//懒汉式
                //创建实例之前可能会有一些准备性的耗时工作
                Thread.sleep(300);
                synchronized (Http_Net.class) {
                    if (instance == null) {//二次检查
                        instance = new Http_Net();
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return instance;
    }

    /**
     * 缓存文件
     */
    private final String RESPONSE_CACHE_FILE = "responseCache";
    /**
     * 缓存大小
     */
    private final long RESPONSE_CACHE_SIZE = 10 * 1024 * 1024L;

    public Impl_DayTxt getDayTxt() {
        Impl_DayTxt netInterface = getRetrofit("https://v1.hitokoto.cn/").create(Impl_DayTxt.class);//NetInterface为接口定义类
        return netInterface;
    }

    private Retrofit getRetrofit(String baseUrl) {
        /*BaseUrl 一般网络请求地址里面,总会有一样得前缀,就像是
        http://192.168.20.241:11008****这就是那个基地址,基地址+NetInterface类里面的
        post()的地址就是一个完整的网络请求地址,这点要注意*/
        Retrofit mRetrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)//添加网络请求的基地址 magnet:?xt=urn:btih:6B7E9DC0CF53D513B17FDCAF98F3124A207138EC
                .addConverterFactory(ScalarsConverterFactory.create())//增加返回值为String的支持
                .addConverterFactory(GsonConverterFactory.create())//添加转换工厂,用于解析json并转化为javaBean
                .client(getHttpClient())//设置参数
                .build();
        return mRetrofit;
    }


    //配置网络请求参数
    private OkHttpClient getHttpClient() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        HttpLogging interceptor = new HttpLogging("mzz");
        interceptor.setColorLevel(Level.INFO);
        if (BaseApp.isApkInDebug()) {//是否是Debug模式
            interceptor.setPrintLevel(HttpLogging.Level.BODY);
            Log_Ma.setIsShow(true);
            builder.readTimeout(180, TimeUnit.SECONDS);
            builder.writeTimeout(180, TimeUnit.SECONDS);
            builder.connectTimeout(180, TimeUnit.SECONDS);
        } else {
            interceptor.setPrintLevel(HttpLogging.Level.NONE);
            Log_Ma.setIsShow(false);
            builder.readTimeout(60, TimeUnit.SECONDS);
            builder.writeTimeout(60, TimeUnit.SECONDS);
            builder.connectTimeout(60, TimeUnit.SECONDS);
        }
        File cacheFile = new File(BaseApp.getContext().getCacheDir(), RESPONSE_CACHE_FILE);//缓存文件
        builder.cache(new Cache(cacheFile, RESPONSE_CACHE_SIZE))//设置用于读取和写入缓存的响应的响应缓存
                .sslSocketFactory(getSSLSocketFactory(), new CustomTrustManager())//信任所有https请求
                .hostnameVerifier(getHostnameVerifier())//设置用于确认响应证书应用于HTTPS连接请求的主机名的验证器。
                .cookieJar(new CookieJar() {

                    @Override
                    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                        map.put(url.toString(), cookies);
                    }

                    @Override
                    public List<Cookie> loadForRequest(HttpUrl url) {
                        List<Cookie> cookies = map.get(url.toString());
                        return cookies != null ? cookies : new ArrayList<>();
                    }
                })

                .addInterceptor(interceptor)//使用日志拦截器
                .proxy(Proxy.NO_PROXY);//不使用代理的模式

        OkHttpClient client = builder.build();
        return client;
    }

    private SSLSocketFactory getSSLSocketFactory() {
        SSLSocketFactory ssfFactory = null;
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, new TrustManager[]{new CustomTrustManager()}, new SecureRandom());
            ssfFactory = sc.getSocketFactory();
        } catch (Exception e) {
        }
        return ssfFactory;
    }

    private class CustomTrustManager implements X509TrustManager {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

        }

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    }

    private HostnameVerifier getHostnameVerifier() {
        HostnameVerifier hostnameVerifier = (hostname, session) -> true;
        return hostnameVerifier;
    }

    public static Map<String, String> getMap() {
        return new HashMap<>();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值