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

 更新时间:2024年01月30日 10:02:04   作者:ayuyihu  
Hutool是一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,这篇文章主要给大家介绍了关于Java Hutool工具包中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);
			}
		}

		// 初始化URL
		urlWithParamIfGet();
		// 初始化 connection
		initConnection();
		// 发送请求
		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了

    @Autowired
    public 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的全局超时时间配置

    @Autowired
    public 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);
    }

附:hutool-http使用注意

Hutool谐音“糊涂”,一方面简洁易懂,一方面寓意“难得糊涂”,但是糊涂中可能就会掉入坑中。查看HttpUtil源码,再调用HttpUtil中的post或者get方法后,会创建HttpRequest对象调用execute()方法,建立连接发送请求。

但是初始化连接的时候会直接创建一个新的连接,如果要循环调用大量接口,这个是很不合适的。

总结 

到此这篇关于Java Hutool工具包中HttpUtil的日志统一打印及统一超时时间配置的文章就介绍到这了,更多相关HttpUtil日志统一打印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • idea http request无法识别环境变量的解决步骤

    idea http request无法识别环境变量的解决步骤

    AlibabaCloudToolkit插件安装后在 Editor->File Types增加 AlibabaCloudROStemplates(JSON)项且会配置为解析*.json 文件,导致http client无法正确解析http-client.env.json文件而无法读取环境变量,本文介绍idea http request无法识别环境变量问题,需要的朋友可以参考下
    2023-08-08
  • 关于java开发的性能问题总结(必看)

    关于java开发的性能问题总结(必看)

    下面小编就为大家带来一篇关于java开发的性能问题总结(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • IDEA连接MySQL提示serverTimezone的问题及解决方法

    IDEA连接MySQL提示serverTimezone的问题及解决方法

    很多朋友私聊小编,使用IDEA软件连接MySQL数据库时总是提示Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.的错误,小编就不一一回复大家了,下面小编把我的解决方法分享到脚本之家平台,需要的朋友参考下吧
    2021-05-05
  • 基于google zxing的Java二维码生成与解码

    基于google zxing的Java二维码生成与解码

    这篇文章主要为大家详细介绍了基于google zxing的Java二维码生成与解码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Spring Cloud Eureka服务注册中心入门流程分析

    Spring Cloud Eureka服务注册中心入门流程分析

    这篇文章主要介绍了Spring Cloud Eureka服务注册中心入门流程分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • springboot jpa 实现返回结果自定义查询

    springboot jpa 实现返回结果自定义查询

    这篇文章主要介绍了springboot jpa 实现返回结果自定义查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 使用Idea maven创建Spring项目过程图解

    使用Idea maven创建Spring项目过程图解

    这篇文章主要介绍了使用Idea maven创建Spring项目过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 详解Mybatis中的PooledDataSource

    详解Mybatis中的PooledDataSource

    这篇文章主要介绍了详解Mybatis中的PooledDataSource,PooledDataSource使用了数据库连接池可以实现数据库连接池的重复利用,还能控制连接数据库的连接上限
    2022-06-06
  • 如何在SpringBoot项目中集成SpringSecurity进行权限管理

    如何在SpringBoot项目中集成SpringSecurity进行权限管理

    在本文中,我们将讨论如何在Spring Boot项目中集成权限管理,我们将使用Spring Security框架,这是一个专门用于实现安全性功能的框架,包括认证和授权,需要的朋友可以参考下
    2023-07-07
  • Struts2实现对action请求对象的拦截操作方法

    Struts2实现对action请求对象的拦截操作方法

    这篇文章主要介绍了Struts2实现对action请求对象的拦截操作方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11

最新评论