Hutool工具包中HttpUtil的日志统一打印以及统一超时时间配置

Hutool工具包中HttpUtil的日志统一打印

  • 为何要打印Http请求日志
    • HttpUtil的请求拦截器(HttpInterceptor.Chain<HttpRequest>)、响应拦截器(HttpInterceptor.Chain<HttpResponse>)
    • HttpUtil的全局日志配置
    • HttpUtil的超时时间源码分析
    • HttpUtil的全局超时时间配置

为何要打印Http请求日志

使用hutool工具包中的HttpUtil,为了便于排查问题以及控制请求时间,每次都要在请求前后log日志,每次都需要设置超时时间,十分麻烦。

        log.info("请求路径:{},请求体:{}", url, body);HttpResponse response = HttpUtil.createPost(url).body(body).timeout(3000).execute();log.info("请求结果:{}", response);

HttpUtil的请求拦截器(HttpInterceptor.Chain)、响应拦截器(HttpInterceptor.Chain)

从HttpUtil的execute()方法点进去几步,可以看到以下代码

	/*** 请求前的拦截器,用于在请求前重新编辑请求*/final HttpInterceptor.Chain<HttpRequest> requestInterceptors = GlobalInterceptor.INSTANCE.getCopiedRequestInterceptor();/*** 响应后的拦截器,用于在响应后处理逻辑*/final HttpInterceptor.Chain<HttpResponse> responseInterceptors = GlobalInterceptor.INSTANCE.getCopiedResponseInterceptor();/*** 执行Reuqest请求** @param isAsync 是否异步* @return this*/public HttpResponse execute(boolean isAsync) {return doExecute(isAsync, config.requestInterceptors, config.responseInterceptors);}

这里有两个拦截器配置,分别是请求拦截器配置config.requestInterceptors, 响应拦截器配置config.responseInterceptors

继续点进去可以看到拦截器的执行逻辑,分别在请求前和请求后执行,代码进行省略,只保留我们需要的逻辑

/*** 执行Reuqest请求** @param isAsync              是否异步* @param requestInterceptors  请求拦截器列表* @param responseInterceptors 响应拦截器列表* @return this*/private HttpResponse doExecute(boolean isAsync, HttpInterceptor.Chain<HttpRequest> requestInterceptors,HttpInterceptor.Chain<HttpResponse> responseInterceptors) {if (null != requestInterceptors) {for (HttpInterceptor<HttpRequest> interceptor : requestInterceptors) {interceptor.process(this);}}// 初始化URLurlWithParamIfGet();// 初始化 connectioninitConnection();// 发送请求send();// 手动实现重定向HttpResponse httpResponse = sendRedirectIfPossible(isAsync);// 获取响应if (null == httpResponse) {httpResponse = new HttpResponse(this.httpConnection, this.config, this.charset, isAsync, isIgnoreResponseBody());}// 拦截响应if (null != responseInterceptors) {for (HttpInterceptor<HttpResponse> interceptor : responseInterceptors) {interceptor.process(httpResponse);}}return httpResponse;}

HttpUtil的全局日志配置

明白了HttpUtil的execute()方法执行过程,现在我们可以很方便的实现HttpUtil的全局日志了

项目启动时进行添加我们自定义的拦截器即可,这里直接使用toString方法,是因为HttpUtil里面帮我们重写了toString的逻辑,不需要我们自己去解析HttpRequest和HttpResponse了

    @Autowiredpublic void addRequestInterceptor() {GlobalInterceptor.INSTANCE.addRequestInterceptor(httpObj -> log.info(String.valueOf(httpObj)));GlobalInterceptor.INSTANCE.addResponseInterceptor(httpObj -> log.info(String.valueOf(httpObj)));}

HttpUtil的超时时间源码分析

同样的,我们点进timeout()方法可以发现,会分别设置连接超时、读取响应超时。

/*** 默认连接超时*/int connectionTimeout = HttpGlobalConfig.getTimeout();/*** 默认读取超时*/int readTimeout = HttpGlobalConfig.getTimeout();/*** 设置超时,单位:毫秒<br>* 超时包括:** <pre>* 1. 连接超时* 2. 读取响应超时* </pre>** @param milliseconds 超时毫秒数* @return this* @see #setConnectionTimeout(int)* @see #setReadTimeout(int)*/public HttpConfig timeout(int milliseconds) {setConnectionTimeout(milliseconds);setReadTimeout(milliseconds);return this;}/*** 设置连接超时,单位:毫秒** @param milliseconds 超时毫秒数* @return this*/public HttpConfig setConnectionTimeout(int milliseconds) {this.connectionTimeout = milliseconds;return this;}/*** 设置连接超时,单位:毫秒** @param milliseconds 超时毫秒数* @return this*/public HttpConfig setReadTimeout(int milliseconds) {this.readTimeout = milliseconds;return this;}

但是这两个超时字段配置是由默认的全局配置的。
所以配置一个全局的超时时间就比较方便了

HttpUtil的全局超时时间配置

    @Autowiredpublic void hutoolHttpUtilConfig() {// 设置hutool HttpUtil的request请求参数打印GlobalInterceptor.INSTANCE.addRequestInterceptor(httpObj -> log.info(String.valueOf(httpObj)));// 设置hutool HttpUtil的response参数打印GlobalInterceptor.INSTANCE.addResponseInterceptor(httpObj -> log.info(String.valueOf(httpObj)));// 设置hutool HttpUtil的连接超时时间、读取响应超时时间HttpGlobalConfig.setTimeout(3000);}

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

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

相关文章

【Linux】进程信号

文章目录 1. 信号的理解1.1 什么是进程信号1.2 见见进程信号1.3 信号的发送与记录1.4 信号的处理1.4.1 信号的三种处理方式1.4.2 核心转储 2. 信号的产生2.1 终端按键产生信号2.2 系统调用产生信号2.3 软件异常产生信号2.4 硬件异常产生信号 3. 信号的保存3.1 信号其他相关概念…

电子锁语音芯片方案,低功耗声音提示ic,WT588F02B-8S

随着科技的不断发展&#xff0c;电子锁已成为现代社会中&#xff0c;安全性和便利性并存的必备设备。如何为电子锁行业增添智能化、人性化的功能已成为行业内的热门话题。 在这个迅速发展的市场中&#xff0c;深圳唯创知音推出了一款语音交互方案——WT588F02B-8S 低功耗声音提…

UnxUtils工具包,Windows下使用Linux命令

1. 前言 最近写批处理多了&#xff0c;发现Windows下的bat批处理命令&#xff0c;相比Linux的命令&#xff0c;无论是功能还是多样性&#xff0c;真的差太多了。但有时候又不得不使用bat批处理&#xff0c;好在今天发现了一个不错的工具包&#xff1a;UnxUtils&#xff0c;这个…

Python多线程 threading 和多进程 multiprocessing

1. 并发 vs 并行 线程是程序执行的最小单位&#xff0c;一个进程可以由一个或多个线程组成&#xff0c;各个线程之间也是交叉执行。 并发&#xff0c;相当于单核CPU&#xff0c;宏观同时执行&#xff0c;微观高速切换 交替执行。多线程、高并发这些词语更多地出现在服务端程序…

安装gpu版torch

在官网下载的gpu版本torch总是cpu版 因为这不是真的gpu版&#xff01;&#xff01;&#xff01; 搞了好久简直要疯掉555555 解决方案 通过本地whl文件的方式安装。 来到该网站&#xff1a;https://download.pytorch.org/whl/torch 可以看到各个版本的torch&#xff0c;xu…

4 | 深入了解Pandas强大功能

文章目录 深入了解Pandas强大功能1. 聚合操作2. 数据迭代3. apply方法4. agg方法5. where方法6. query方法7. 透视(pivot)操作总结深入了解Pandas强大功能 Pandas是Python中最受欢迎的数据处理库之一,它提供了丰富的功能,使得数据的读取、处理、分析和可视化变得异常便捷。…

PyTorch翻译官网教程-DEPLOYING PYTORCH IN PYTHON VIA A REST API WITH FLASK

官网链接 Deploying PyTorch in Python via a REST API with Flask — PyTorch Tutorials 2.0.1cu117 documentation 通过flask的rest API在python中部署pytorch 在本教程中&#xff0c;我们将使用Flask部署PyTorch模型&#xff0c;并开放用于模型推断的REST API。特别是&…

06-C++ 基本算法 - 二分法

&#x1f4d6; 前言 在这个笔记中&#xff0c;我们将介绍二分法这种基本的算法思想&#xff0c;以及它在 C 中的应用。我们将从一个小游戏猜数字开始&#xff0c;通过这个案例来引出二分法的概念。然后我们将详细讲解什么是二分法以及它的套路和应用。最后&#xff0c;我们还会…

在 3ds Max 中创建逼真的玻璃材质

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 尽管本教程基于 3ds Max&#xff0c;但相同的设置适用于许多其他 3D 产品。 注意&#xff1a;单击每个步骤中的缩略图可查看更大的屏幕截图&#xff0c;其中包括视口和用户界面的相关部分。 步骤 1由于本教…

广西学子复读15年,不服从分配。网友:完全是浪费时间

广西学子复读15年&#xff0c;不服从分配。网友&#xff1a;完全是浪费时间 唐尚珺的复读行为引起了网友们的不同解读。有人认为他是一个执念深重的人&#xff0c;目标是考上清华北大&#xff0c;但这个说法是否真实&#xff0c;我们无法确定。无论如何&#xff0c;我们必须认识…

electron+vue3全家桶+vite项目搭建【24】设置应用图标,打包文件的图标

文章目录 引入实现步骤测试结果 引入 demo项目地址 在electron中&#xff0c;我们可以通过electron-builder的配置文件来设置打包后的应用图标 实现步骤 因为mac环境下的图标需要特殊格式&#xff0c;这里我们可以利用electron-icon-builder进行配置 1.引入相关依赖 # 安…

GPT 如此强大,我们可以利用它实现什么?

GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer结构的预训练语言生成模型&#xff0c;由OpenAI研发。它可以生成高质量的自然语言文本&#xff0c;取得了很好的效果&#xff0c;被广泛应用于各个领域。以下是一些利用GPT实现的应用。 一…

Linux 处理僵尸进程

要查看僵尸进程的来源&#xff0c;可以使用ps命令或top命令。 使用ps命令&#xff1a; 打开终端或命令行界面&#xff0c;输入以下命令并按Enter执行&#xff1a;ps -e -o pid,ppid,state,cmd | grep -w Z该命令将显示所有僵尸进程的进程ID&#xff08;PID&#xff09;、父进…

ts中setState的类型

两种方法: 例子: 父组件 const [value, setValue] useState(); <ChildsetValue{setValue} />子组件 interface Ipros {setValue: (value: string) > void } const Child: React.FC<Ipros> (props) > {}

less常用用法简略总结

1、嵌套&#xff08;与sass相同&#xff09; ul{width:100px;li{width:99px;} } 2、变量&#xff08;变量名&#xff1a;值&#xff09;&#xff0c;sass&#xff1a;&#xff08;$color:green&#xff09; ColorA:green; ColorB:red; .box1{background-color: ColorA; } .b…

SpringMvc配置静态资源访问路径

文章目录 1. 整体流程2. registry.addResourceHandler()2.1 函数分析2.2 结果演示 3. ResourceHandlerRegistration.addResourceLocations()3.1 函数分析3.2 结果演示 1. 整体流程 1. 写一个配置类继承WebMvcConfigurationSupport 2. 利用 registry.addResourceHandler("…

chatgpt 讯飞星火 对比

"ChatGPT"和"讯飞星火"是两个不同的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;由不同的公司开发和提供。以下是它们之间的一些对比&#xff1a;1.开发公司&#xff1a; ChatGPT&#xff1a;由OpenAI开发&#xff0c;是OpenAI旗下的GPT-3模型…

Vue成绩案例实现添加、删除、显示无数据、添加日期、总分均分以及数据本地化等功能

一、成绩案例 ✅✅✅通过本次案例实现添加、删除、显示无数据、添加日期、总分均分以及数据本地化等功能。 准备成绩案例模板&#xff0c;我们需要在这些模板上面进行功能操作。 <template><div class"score-case"><div class"table">…

nginx基础3——配置文件详解(实用功能篇)

文章目录 一、平滑升级二、修饰符2.1 无修饰符效果2.2 精准匹配&#xff08;&#xff09;2.3 区分大小写匹配&#xff08;~&#xff09;2.4 不区分大小写匹配&#xff08;~*&#xff09;2.5 匹配优先级 三、访问控制四、用户认证五、配置https六、开启状态界面七、rewrite重写u…

matplotlib 3D

import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np# 创建一个三维坐标轴 fig plt.figure() ax fig.add_subplot(221, projection3d) xx fig.add_subplot(222) yy fig.add_subplot(223) xy fig.add_subplot(224)# 生成示例数据…