Okhttp-LoggingInterceptor的简单使用

news2024/11/22 16:38:34
概述

Okhttp除了提供强大的get,post网络请求外,还包含请求日志的拦截器,可以监视,重写,重试调用请求。

简单使用

我们在构造OkHttpClient时,通过addInterceptor()方法添加我们需要的过滤器。

   object OkhttpUtils{
    ……
    private var client:OkHttpClient

    //init方法在kotlin静态类中,是最先被调用的方法
    init {
        val httpLoggingInterceptor = HttpLoggingInterceptor()
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
        //构造Http对象
        client = OkHttpClient().newBuilder()
            .connectTimeout(10L, TimeUnit.SECONDS)
            .readTimeout(10L, TimeUnit.SECONDS)
            .writeTimeout(10L, TimeUnit.SECONDS)
            .addInterceptor(httpLoggingInterceptor)
            .build()
    }
    
    ……
   }
httpLoggingInterceptor

使用默认的httpLoggingInterceptor打印日志如下,可以发现,除了关键信息外,还有一些冗余或者很长的非关键日志,我们可以通过自定义日志过滤器找到我们需要的信息。

 自定义LoggingInterceptor

1:写一个类,实现Interceptor接口,复写intercept(chain:Interceptor.Chain):Response{}方法

package com.example.okhttp.http

import android.util.Log
import okhttp3.Interceptor
import okhttp3.MediaType
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import okhttp3.ResponseBody
import okhttp3.ResponseBody.Companion.toResponseBody
import okio.Buffer

class TypeInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val time = System.currentTimeMillis()
        //获取request
        val request = chain.request()
        //request.body转字符串
        val str = request.body?.toString() ?: "request.body is null"
        Log.d(
            Hiokhttp.TAG, String.format(
                "sending request url is %s with body is %s",
                request.url, str
            )
        )
        //获取response,因为okhttp的原理,response.body在获取一次以后,
        //就不能再生成响应流了,因此需要构造一个新的返回
        val response = chain.proceed(request = request)
        //将response的数据保存到新的response
        val data: String = response.body?.string() ?: "response.body is null"

        //构建新的response
        val medieType = request.body?.contentType()
        val newBody = data.toResponseBody(medieType)
        val end = System.currentTimeMillis()
        Log.d(
            Hiokhttp.TAG, String.format(
                "received url is %s with host time %.1f ms ",
                request.url, (end - time) / 1e3
            )
        )
        return response.newBuilder().body(newBody).build()

    }
}

下面看一下效果,我们将请求url和请求体,以及花费时间 成功打印了出来,避免冗余繁琐的日志。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/781748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot知识范围-学习步骤【JSB系列之000】

语言视频选择收录专辑链接C张雪峰推荐选择了计算机专业之后-在大学期间卷起来-【大学生活篇】JAVA黑马B站视频JAVA部分的知识范围、学习步骤详解JAVAWEB黑马B站视频JAVAWEB部分的知识范围、学习步骤详解SpringBootSpringBoot知识范围-学习步骤【JSB系列之000】微信小程序详细解…

【stable diffusion】保姆级入门课程04-Stable diffusion(SD)图生图-局部重绘的用法

目录 0.本章素材 1.什么是局部重绘 2.局部重绘和涂鸦有什么不同 3.操作界面讲解 3.1.蒙版模糊 3.2.蒙版模式 3.3.蒙版蒙住的内容 3.4.重绘区域 4.局部重绘的应用(面部修复) 5.课后训练 0.本章素材 chilloutmix模型(真人模型)百度地址&#xf…

数据结构—树状数组

树状数组 单点修改、区间查询区间修改、单点查询区间修改、区间查询 单点修改、区间查询 这里讲解树状数组的最基本操作单点修改、区间查询,当然能做到单点修改、区间查询,肯定就能做到单点修改、单点查询了。树状数组是用来快速求前缀和的,…

MGRE之OSPF实验

目录 题目: 步骤二:拓扑设计与地址规划​编辑 步骤三:IP地址配置 步骤四:缺省路由配置 步骤五:NAT的配置 步骤六:MGRE配置 中心站点R1配置 分支站点配置 中心站点R5 R1配置 分支站点配置 检测&…

UE 材质学习补充

Add Name Reroute Node ...(本地变量) 该节点可以整理节点,优化界面 Texture Texture(纹理图像),一般由RGB三个通道混合构成,RGB三个通道的值代表亮度,RGB三个通道分别都是0-1(0-255&#xff09…

征服FarmerJohn(二) Naptime【USACO05JAN】

题解目录 前言题目内容题目描述输入输出样例题目思路示例代码AC图片 后记往期精彩 前言 在上一期征服FarmerJohn(一)三角形【USACO2020FEB-B】结束之后,我们来看一道难度有所提升的DP问题,也就是常说的动态规划,今天我…

Please set the ROCKETMQ_HOME variable in your environment!

原因 启动ROCKETMQ执行命令start mqnamesrv.cmd时报错 翻译意思是请在您的环境中设置ROCKETMQ_HOME变量! 查看mqnamesrv.cmd可以看到如果"%ROCKETMQ_HOME%\bin\runserver.cmd"不存在会报此错误 配置上环境变量ROCKETMQ_HOME即可

《深入理解计算机系统》(美)布赖恩特(Bryant,R.E.) 等

适合对象:对计算机感兴趣的朋友。 需要相关资料的可私信我。 持续更新中: 第一章:计算机系统漫游 主要知识点:解读全书结构框架,解释OS的原理和相关硬件软件。计算机系统是由硬件和系统软件组成,共同协作…

kafka消费者api和分区分配和offset消费

kafka消费者 消费者的消费方式为主动从broker拉取消息,由于消费者的消费速度不同,由broker决定消息发送速度难以适应所有消费者的能力 拉取数据的问题在于,消费者可能会获得空数据 消费者组工作流程 Consumer Group(CG&#x…

如何在 SwiftUI 中使用 Touch ID 和 Face ID?

1. 需要通过指纹,面容认证后才能打开 App 2. 添加配置 需要向 Info.plist 文件中添加一个配置,向用户说明为什么要访问 添加 Privacy - Face ID Usage Description 并为其赋予值 $(PRODUCT_NAME) need Touch Id or Face ID permission for app lock 3. …

RTC在不同业务场景下的最佳音质实践

背景介绍 WebRTC是目前实时音视频领域最流行的开源框架。2010年Google收购GIPS引擎后,将其纳入Chrome体系且开源后, 命名为“WebRTC”。WebRTC获得各大浏览器厂商的支持并纳入W3C标准,促进了实时音视频在移动互联网应用中的 普及。2021年1月&…

算法练习——力扣随笔【LeetCode】【C++】

文章目录 LeetCode 练习随笔力扣上的题目和 OJ题目相比不同之处?定义问题排序问题统计问题其他 LeetCode 练习随笔 做题环境 C 中等题很值,收获挺多的 不会的题看题解,一道题卡1 h ,多来几道,时间上耗不起。 力扣上的题…

Pytorch个人学习记录总结 06

目录 神经网络-卷积层 torch.nn.Conv2d 神经网络-最大池化的使用 torch.nn.MaxPool2d 神经网络-卷积层 torch.nn.Conv2d torch.nn.Conv2d的官方文档地址 CLASS torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue,…

TMS FNC Dashboard Pack Crack

TMS FNC Dashboard Pack Crack TTMSFNCWidgetProgress:循环进度指示器 TTMSFNCWidget设定值:带范围和设定值的值指示器 TTMSFNCWidgetMultiProgress:多个值的基于同心圆的进度指示器 TTMSFNCWidgetDistributionIndicator:各种模式…

【Kubernetes部署篇】ingress-nginx高可用架构实施部署

文章目录 一、环境说明二、实施过程1、部署Ingress Controller2、安装并配置Nginx3、安装并配置Keepalived3、测试keepalived主备切换 三、创建Ingress规则,测试七层转发 一、环境说明 1、环境说明: IP地址主机名称备注16.32.15.201node-1K8S节点16.32…

AMS358i和施耐德TM241 EtherNet 通信

产品、配件及工具型号 设备名称 型号 数量 激光测距 AMS358i 1 直流电源24VDC 1 连接电缆 KD U-M12-5A-V1-050 1 交换机 1 施耐德PLC TM241 1 AMS358i通信网线 KSS ET-M12-4A-RJ45-A-P7-020 1 网线 双向水晶头 2 电气连接图及说明 点击桌面的Somachi…

【NLP】使用 Keras 保存和加载深度学习模型

一、说明 训练深度学习模型是一个耗时的过程。您可以在训练期间和训练后保存模型进度。因此,您可以从上次中断的地方继续训练模型,并克服漫长的训练挑战。 在这篇博文中,我们将介绍如何保存模型并使用 Keras 逐步加载它。我们还将探索模型检查…

虹科活动 | 虹科ADAS自动驾驶研讨会

​​虹科ADAS/自动驾驶研讨会将于8月7日在上海闵行展开——加快ADAS/AD开发步伐! 期待您的参与!

Day45: 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

目录 300.最长递增子序列 思路 674. 最长连续递增序列 思路 718. 最长重复子数组 思路 300.最长递增子序列 300. 最长递增子序列 - 力扣(LeetCode) 思路 1. 确定dp数组及其下标含义 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列…

【每日运维】判断服务器时间同步是否正常

对于 ntpd 服务 ntpq -premote:时间同步源的 IP 地址或域名refid:参考 ID,它是一个代表时间源的唯一标识符st:层级,表示时间同步源的层级关系。较低的层级意味着更接近原子钟的时间源t:状态,表…