最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置

 更新時(shí)間:2024年01月30日 10:02:04   作者:ayuyihu  
Hutool是一個(gè)Java基礎(chǔ)工具類,對(duì)文件、流、加密解密、轉(zhuǎn)碼、正則、線程、XML等JDK方法進(jìn)行封裝,組成各種Util工具類,這篇文章主要給大家介紹了關(guān)于Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置的相關(guān)資料,需要的朋友可以參考下

為何要打印Http請(qǐng)求日志

使用hutool工具包中的HttpUtil,為了便于排查問(wèn)題以及控制請(qǐng)求時(shí)間,每次都要在請(qǐng)求前后log日志,每次都需要設(shè)置超時(shí)時(shí)間,十分麻煩。

        log.info("請(qǐng)求路徑:{},請(qǐng)求體:{}", url, body);
        HttpResponse response = HttpUtil.createPost(url).body(body).timeout(3000).execute();
        log.info("請(qǐng)求結(jié)果:{}", response);

HttpUtil的請(qǐng)求攔截器(HttpInterceptor.Chain)、響應(yīng)攔截器(HttpInterceptor.Chain)

從HttpUtil的execute()方法點(diǎn)進(jìn)去幾步,可以看到以下代碼

	/**
	 * 請(qǐng)求前的攔截器,用于在請(qǐng)求前重新編輯請(qǐng)求
	 */
	final HttpInterceptor.Chain<HttpRequest> requestInterceptors = GlobalInterceptor.INSTANCE.getCopiedRequestInterceptor();
	/**
	 * 響應(yīng)后的攔截器,用于在響應(yīng)后處理邏輯
	 */
	final HttpInterceptor.Chain<HttpResponse> responseInterceptors = GlobalInterceptor.INSTANCE.getCopiedResponseInterceptor();
	

	/**
	 * 執(zhí)行Reuqest請(qǐng)求
	 *
	 * @param isAsync 是否異步
	 * @return this
	 */
	public HttpResponse execute(boolean isAsync) {
		return doExecute(isAsync, config.requestInterceptors, config.responseInterceptors);
	}

這里有兩個(gè)攔截器配置,分別是請(qǐng)求攔截器配置config.requestInterceptors, 響應(yīng)攔截器配置config.responseInterceptors

繼續(xù)點(diǎn)進(jìn)去可以看到攔截器的執(zhí)行邏輯,分別在請(qǐng)求前和請(qǐng)求后執(zhí)行,代碼進(jìn)行省略,只保留我們需要的邏輯

	/**
	 * 執(zhí)行Reuqest請(qǐng)求
	 *
	 * @param isAsync              是否異步
	 * @param requestInterceptors  請(qǐng)求攔截器列表
	 * @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ā)送請(qǐng)求
		send();

		// 手動(dòng)實(shí)現(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í)行過(guò)程,現(xiàn)在我們可以很方便的實(shí)現(xiàn)HttpUtil的全局日志了

項(xiàng)目啟動(dòng)時(shí)進(jìn)行添加我們自定義的攔截器即可,這里直接使用toString方法,是因?yàn)镠ttpUtil里面幫我們重寫(xiě)了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的超時(shí)時(shí)間源碼分析

同樣的,我們點(diǎn)進(jìn)timeout()方法可以發(fā)現(xiàn),會(huì)分別設(shè)置連接超時(shí)、讀取響應(yīng)超時(shí)。

	/**
	 * 默認(rèn)連接超時(shí)
	 */
	int connectionTimeout = HttpGlobalConfig.getTimeout();
	/**
	 * 默認(rèn)讀取超時(shí)
	 */
	int readTimeout = HttpGlobalConfig.getTimeout();

	/**
	 * 設(shè)置超時(shí),單位:毫秒<br>
	 * 超時(shí)包括:
	 *
	 * <pre>
	 * 1. 連接超時(shí)
	 * 2. 讀取響應(yīng)超時(shí)
	 * </pre>
	 *
	 * @param milliseconds 超時(shí)毫秒數(shù)
	 * @return this
	 * @see #setConnectionTimeout(int)
	 * @see #setReadTimeout(int)
	 */
	public HttpConfig timeout(int milliseconds) {
		setConnectionTimeout(milliseconds);
		setReadTimeout(milliseconds);
		return this;
	}
	
	/**
	 * 設(shè)置連接超時(shí),單位:毫秒
	 *
	 * @param milliseconds 超時(shí)毫秒數(shù)
	 * @return this
	 */
	public HttpConfig setConnectionTimeout(int milliseconds) {
		this.connectionTimeout = milliseconds;
		return this;
	}
	
	/**
	 * 設(shè)置連接超時(shí),單位:毫秒
	 *
	 * @param milliseconds 超時(shí)毫秒數(shù)
	 * @return this
	 */
	public HttpConfig setReadTimeout(int milliseconds) {
		this.readTimeout = milliseconds;
		return this;
	}

但是這兩個(gè)超時(shí)字段配置是由默認(rèn)的全局配置的。

所以配置一個(gè)全局的超時(shí)時(shí)間就比較方便了

HttpUtil的全局超時(shí)時(shí)間配置

    @Autowired
    public void hutoolHttpUtilConfig() {
        // 設(shè)置hutool HttpUtil的request請(qǐng)求參數(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的連接超時(shí)時(shí)間、讀取響應(yīng)超時(shí)時(shí)間
        HttpGlobalConfig.setTimeout(3000);
    }

附:hutool-http使用注意

Hutool諧音“糊涂”,一方面簡(jiǎn)潔易懂,一方面寓意“難得糊涂”,但是糊涂中可能就會(huì)掉入坑中。查看HttpUtil源碼,再調(diào)用HttpUtil中的post或者get方法后,會(huì)創(chuàng)建HttpRequest對(duì)象調(diào)用execute()方法,建立連接發(fā)送請(qǐng)求。

但是初始化連接的時(shí)候會(huì)直接創(chuàng)建一個(gè)新的連接,如果要循環(huán)調(diào)用大量接口,這個(gè)是很不合適的。

總結(jié) 

到此這篇關(guān)于Java Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置的文章就介紹到這了,更多相關(guān)HttpUtil日志統(tǒng)一打印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis自定義Sql模板語(yǔ)法問(wèn)題

    Mybatis自定義Sql模板語(yǔ)法問(wèn)題

    這篇文章主要介紹了Mybatis自定義Sql模板語(yǔ)法問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • WebDriver實(shí)現(xiàn)自動(dòng)化打開(kāi)IE中的google網(wǎng)頁(yè)并實(shí)現(xiàn)搜索

    WebDriver實(shí)現(xiàn)自動(dòng)化打開(kāi)IE中的google網(wǎng)頁(yè)并實(shí)現(xiàn)搜索

    這篇文章主要介紹了WebDriver實(shí)現(xiàn)自動(dòng)化打開(kāi)IE中的google網(wǎng)頁(yè)并實(shí)現(xiàn)搜索,需要的朋友可以參考下
    2014-04-04
  • java實(shí)現(xiàn)遞歸文件列表的方法

    java實(shí)現(xiàn)遞歸文件列表的方法

    這篇文章主要介紹了java實(shí)現(xiàn)遞歸文件列表的方法,實(shí)例分析了java采用遞歸算法遍歷文件的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Java利用反射實(shí)現(xiàn)框架類的方法實(shí)例

    Java利用反射實(shí)現(xiàn)框架類的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Java利用反射實(shí)現(xiàn)框架類的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java操作壓縮包解壓過(guò)程詳解

    Java操作壓縮包解壓過(guò)程詳解

    這篇文章主要介紹了Java操作壓縮包解壓過(guò)程,項(xiàng)目開(kāi)發(fā)中,總會(huì)遇到解壓縮文件的時(shí)候,比如用戶下載多個(gè)文件時(shí),服務(wù)端可以將多個(gè)文件壓縮成一個(gè)文件,用戶上傳資料時(shí),允許上傳壓縮文件,服務(wù)端進(jìn)行解壓讀取每一個(gè)文件,使用場(chǎng)景是很多的,下面來(lái)詳細(xì)講解,需要的朋友可以參考下
    2024-10-10
  • SpringMVC請(qǐng)求數(shù)據(jù)詳解講解

    SpringMVC請(qǐng)求數(shù)據(jù)詳解講解

    Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級(jí) Web 開(kāi)發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì),本章來(lái)講解SpringMVC如何請(qǐng)求數(shù)據(jù)
    2022-07-07
  • 解決idea出現(xiàn)的java.lang.OutOfMemoryError:?Java?heap?space的問(wèn)題

    解決idea出現(xiàn)的java.lang.OutOfMemoryError:?Java?heap?space的問(wèn)題

    我們?cè)谑褂胕dea的時(shí)候經(jīng)常會(huì)遇到一些問(wèn)題,本文介紹了如何解決idea出現(xiàn)的java.lang.OutOfMemoryError:?Java?heap?space的問(wèn)題,文中有相關(guān)的圖文示例,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • MyBatis使用雪花ID的實(shí)現(xiàn)

    MyBatis使用雪花ID的實(shí)現(xiàn)

    本文主要介紹了MyBatis使用雪花ID的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java 中 ObjectMapper用法(一個(gè)簡(jiǎn)單 Demo 講清楚)

    Java 中 ObjectMapper用法(一個(gè)簡(jiǎn)單 Demo 講清楚)

    ObjectMapper是Jackson庫(kù)中的一個(gè)主要類,它負(fù)責(zé)將Java對(duì)象轉(zhuǎn)換為 JSON格式(序列化),或?qū)SON數(shù)據(jù)轉(zhuǎn)換為Java 對(duì)象(反序列化),本文給大家介紹Java 中 ObjectMapper用法,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • 在Struts2中的結(jié)果集類型

    在Struts2中的結(jié)果集類型

    本篇文章,小編為大家介紹關(guān)于在Struts2中的結(jié)果集類型,有需要的朋友可以參考一下
    2013-04-04

最新評(píng)論

昌邑市| 武鸣县| 涞源县| 黔江区| 唐山市| 宝兴县| 萨迦县| 中江县| 淮安市| 灵武市| 奇台县| 本溪市| 垫江县| 庆城县| 涿鹿县| 云霄县| 鹤壁市| 临沧市| 象山县| 扶绥县| 奈曼旗| 余干县| 阳山县| 隆昌县| 贡觉县| 固原市| 定边县| 黎城县| 富裕县| 崇礼县| 康乐县| 商城县| 鄱阳县| 河北区| 聂荣县| 吉安市| 青冈县| 梁河县| 监利县| 定南县| 临猗县|