Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時時間配置
為何要打印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(); /** * 執(zhí)行Reuqest請求 * * @param isAsync 是否異步 * @return this */ public HttpResponse execute(boolean isAsync) { return doExecute(isAsync, config.requestInterceptors, config.responseInterceptors); }
這里有兩個攔截器配置,分別是請求攔截器配置config.requestInterceptors, 響應攔截器配置config.responseInterceptors
繼續(xù)點進去可以看到攔截器的執(zhí)行邏輯,分別在請求前和請求后執(zhí)行,代碼進行省略,只保留我們需要的邏輯
/** * 執(zhí)行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(); // 發(fā)送請求 send(); // 手動實現(xiàn)重定向 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()方法執(zhí)行過程,現(xiàn)在我們可以很方便的實現(xiàn)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()方法可以發(fā)現(xiàn),會分別設置連接超時、讀取響應超時。
/** * 默認連接超時 */ int connectionTimeout = HttpGlobalConfig.getTimeout(); /** * 默認讀取超時 */ int readTimeout = HttpGlobalConfig.getTimeout(); /** * 設置超時,單位:毫秒<br> * 超時包括: * * <pre> * 1. 連接超時 * 2. 讀取響應超時 * </pre> * * @param milliseconds 超時毫秒數(shù) * @return this * @see #setConnectionTimeout(int) * @see #setReadTimeout(int) */ public HttpConfig timeout(int milliseconds) { setConnectionTimeout(milliseconds); setReadTimeout(milliseconds); return this; } /** * 設置連接超時,單位:毫秒 * * @param milliseconds 超時毫秒數(shù) * @return this */ public HttpConfig setConnectionTimeout(int milliseconds) { this.connectionTimeout = milliseconds; return this; } /** * 設置連接超時,單位:毫秒 * * @param milliseconds 超時毫秒數(shù) * @return this */ public HttpConfig setReadTimeout(int milliseconds) { this.readTimeout = milliseconds; return this; }
但是這兩個超時字段配置是由默認的全局配置的。
所以配置一個全局的超時時間就比較方便了
HttpUtil的全局超時時間配置
@Autowired public void hutoolHttpUtilConfig() { // 設置hutool HttpUtil的request請求參數(shù)打印 GlobalInterceptor.INSTANCE.addRequestInterceptor(httpObj -> log.info(String.valueOf(httpObj))); // 設置hutool HttpUtil的response參數(shù)打印 GlobalInterceptor.INSTANCE.addResponseInterceptor(httpObj -> log.info(String.valueOf(httpObj))); // 設置hutool HttpUtil的連接超時時間、讀取響應超時時間 HttpGlobalConfig.setTimeout(3000); }
附:hutool-http使用注意
Hutool諧音“糊涂”,一方面簡潔易懂,一方面寓意“難得糊涂”,但是糊涂中可能就會掉入坑中。查看HttpUtil源碼,再調(diào)用HttpUtil中的post或者get方法后,會創(chuàng)建HttpRequest對象調(diào)用execute()方法,建立連接發(fā)送請求。
但是初始化連接的時候會直接創(chuàng)建一個新的連接,如果要循環(huán)調(diào)用大量接口,這個是很不合適的。
總結
到此這篇關于Java Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時時間配置的文章就介紹到這了,更多相關HttpUtil日志統(tǒng)一打印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring實戰(zhàn)之使用p:命名空間簡化配置操作示例
這篇文章主要介紹了Spring實戰(zhàn)之使用p:命名空間簡化配置操作,結合實例形式分析了spring p:命名空間簡單配置與使用操作技巧,需要的朋友可以參考下2019-12-12關于idea中出現(xiàn)nbsp和zwsp的完美解決辦法
本文給大家介紹關于idea中出現(xiàn)nbsp和zwsp的解決辦法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2022-06-06前端如何調(diào)用后端接口進行數(shù)據(jù)交互詳解(axios和SpringBoot)
一般來講前端不會給后端接口,而是后端給前端接口的情況比較普遍,下面這篇文章主要給大家介紹了關于前端如何調(diào)用后端接口進行數(shù)據(jù)交互的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-03-03SpringBoot項目中如何動態(tài)切換數(shù)據(jù)源、數(shù)據(jù)庫
本文主要介紹了SpringBoot項目中如何動態(tài)切換數(shù)據(jù)源、數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-02-02在Android的應用中實現(xiàn)網(wǎng)絡圖片異步加載的方法
這篇文章主要介紹了在Android的應用中實現(xiàn)網(wǎng)絡圖片異步加載的方法,一定程度上有助于提高安卓程序的使用體驗,需要的朋友可以參考下2015-07-07Springboot項目中運用vue+ElementUI+echarts前后端交互實現(xiàn)動態(tài)圓環(huán)圖(推薦)
今天給大家?guī)硪黄坛剃P于Springboot項目中運用vue+ElementUI+echarts前后端交互實現(xiàn)動態(tài)圓環(huán)圖的技能,包括環(huán)境配置及圓環(huán)圖前端后端實現(xiàn)代碼,感興趣的朋友一起看看吧2021-06-06