Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時時間配置
為何要打印Http請求日志
使用hutool工具包中的HttpUtil,為了便于排查問題以及控制請求時間,每次都要在請求前后log日志,每次都需要設(shè)置超時時間,十分麻煩。
log.info("請求路徑:{},請求體:{}", url, body);
HttpResponse response = HttpUtil.createPost(url).body(body).timeout(3000).execute();
log.info("請求結(jié)果:{}", response);
HttpUtil的請求攔截器(HttpInterceptor.Chain)、響應(yīng)攔截器(HttpInterceptor.Chain)
從HttpUtil的execute()方法點進去幾步,可以看到以下代碼
/**
* 請求前的攔截器,用于在請求前重新編輯請求
*/
final HttpInterceptor.Chain<HttpRequest> requestInterceptors = GlobalInterceptor.INSTANCE.getCopiedRequestInterceptor();
/**
* 響應(yīng)后的攔截器,用于在響應(yīng)后處理邏輯
*/
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, 響應(yīng)攔截器配置config.responseInterceptors
繼續(xù)點進去可以看到攔截器的執(zhí)行邏輯,分別在請求前和請求后執(zhí)行,代碼進行省略,只保留我們需要的邏輯
/**
* 執(zhí)行Reuqest請求
*
* @param isAsync 是否異步
* @param requestInterceptors 請求攔截器列表
* @param responseInterceptors 響應(yīng)攔截器列表
* @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);
// 獲取響應(yīng)
if (null == httpResponse) {
httpResponse = new HttpResponse(this.httpConnection, this.config, this.charset, isAsync, isIgnoreResponseBody());
}
// 攔截響應(yīng)
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),會分別設(shè)置連接超時、讀取響應(yīng)超時。
/**
* 默認(rèn)連接超時
*/
int connectionTimeout = HttpGlobalConfig.getTimeout();
/**
* 默認(rèn)讀取超時
*/
int readTimeout = HttpGlobalConfig.getTimeout();
/**
* 設(shè)置超時,單位:毫秒<br>
* 超時包括:
*
* <pre>
* 1. 連接超時
* 2. 讀取響應(yīng)超時
* </pre>
*
* @param milliseconds 超時毫秒數(shù)
* @return this
* @see #setConnectionTimeout(int)
* @see #setReadTimeout(int)
*/
public HttpConfig timeout(int milliseconds) {
setConnectionTimeout(milliseconds);
setReadTimeout(milliseconds);
return this;
}
/**
* 設(shè)置連接超時,單位:毫秒
*
* @param milliseconds 超時毫秒數(shù)
* @return this
*/
public HttpConfig setConnectionTimeout(int milliseconds) {
this.connectionTimeout = milliseconds;
return this;
}
/**
* 設(shè)置連接超時,單位:毫秒
*
* @param milliseconds 超時毫秒數(shù)
* @return this
*/
public HttpConfig setReadTimeout(int milliseconds) {
this.readTimeout = milliseconds;
return this;
}
但是這兩個超時字段配置是由默認(rèn)的全局配置的。
所以配置一個全局的超時時間就比較方便了
HttpUtil的全局超時時間配置
@Autowired
public void hutoolHttpUtilConfig() {
// 設(shè)置hutool HttpUtil的request請求參數(shù)打印
GlobalInterceptor.INSTANCE.addRequestInterceptor(httpObj -> log.info(String.valueOf(httpObj)));
// 設(shè)置hutool HttpUtil的response參數(shù)打印
GlobalInterceptor.INSTANCE.addResponseInterceptor(httpObj -> log.info(String.valueOf(httpObj)));
// 設(shè)置hutool HttpUtil的連接超時時間、讀取響應(yīng)超時時間
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)用大量接口,這個是很不合適的。
總結(jié)
到此這篇關(guān)于Java Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時時間配置的文章就介紹到這了,更多相關(guān)HttpUtil日志統(tǒng)一打印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
WebDriver實現(xiàn)自動化打開IE中的google網(wǎng)頁并實現(xiàn)搜索
這篇文章主要介紹了WebDriver實現(xiàn)自動化打開IE中的google網(wǎng)頁并實現(xiàn)搜索,需要的朋友可以參考下2014-04-04
解決idea出現(xiàn)的java.lang.OutOfMemoryError:?Java?heap?space的問題
我們在使用idea的時候經(jīng)常會遇到一些問題,本文介紹了如何解決idea出現(xiàn)的java.lang.OutOfMemoryError:?Java?heap?space的問題,文中有相關(guān)的圖文示例,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Java 中 ObjectMapper用法(一個簡單 Demo 講清楚)
ObjectMapper是Jackson庫中的一個主要類,它負(fù)責(zé)將Java對象轉(zhuǎn)換為 JSON格式(序列化),或?qū)SON數(shù)據(jù)轉(zhuǎn)換為Java 對象(反序列化),本文給大家介紹Java 中 ObjectMapper用法,感興趣的朋友跟隨小編一起看看吧2026-01-01

