0


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

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()方法点进去几步,可以看到以下代码

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

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

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

/**
     * 执行Reuqest请求
     *
     * @param isAsync              是否异步
     * @param requestInterceptors  请求拦截器列表
     * @param responseInterceptors 响应拦截器列表
     * @return this
     */privateHttpResponsedoExecute(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 =newHttpResponse(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了

@AutowiredpublicvoidaddRequestInterceptor(){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)
     */publicHttpConfigtimeout(int milliseconds){setConnectionTimeout(milliseconds);setReadTimeout(milliseconds);returnthis;}/**
     * 设置连接超时,单位:毫秒
     *
     * @param milliseconds 超时毫秒数
     * @return this
     */publicHttpConfigsetConnectionTimeout(int milliseconds){this.connectionTimeout = milliseconds;returnthis;}/**
     * 设置连接超时,单位:毫秒
     *
     * @param milliseconds 超时毫秒数
     * @return this
     */publicHttpConfigsetReadTimeout(int milliseconds){this.readTimeout = milliseconds;returnthis;}

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

HttpUtil的全局超时时间配置

@AutowiredpublicvoidhutoolHttpUtilConfig(){// 设置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);}
标签: java http springboot

本文转载自: https://blog.csdn.net/ayuyihu/article/details/129958670
版权归原作者 ayuyihu 所有, 如有侵权,请联系我们删除。

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

还没有评论