解決java.util.zip.ZipException: Not in GZIP format報(bào)錯(cuò)問(wèn)題
java.util.zip.ZipException: Not in GZIP format報(bào)錯(cuò)
最近在對(duì)接第三方接口時(shí)遇到了一個(gè)報(bào)錯(cuò),java.util.zip.ZipException: Not in GZIP format,因?yàn)楣驹谕菩惺褂肎PT提高開(kāi)發(fā)效率,所以我遇事不決先問(wèn)GPT
GPT給我的答案
java.util.zip.ZipException: Not in GZIP format 的報(bào)錯(cuò)一般是由以下幾個(gè)原因?qū)е碌模?/p>
> 1. 壓縮文件格式不正確。也就是說(shuō),你試圖解壓一個(gè)不是GZIP格式的文件。確保要解壓的文件確實(shí)使用GZIP格式進(jìn)行壓縮。
> 2. 文件內(nèi)容已損壞。有可能壓縮時(shí)引入了錯(cuò)誤,或在傳輸過(guò)程中文件被篡改了。導(dǎo)致文件內(nèi)容已經(jīng)損壞,無(wú)法正常解壓。
> 3. 編碼格式不匹配。GZIP格式只支持部分編碼,如果壓縮時(shí)使用了不支持的編碼,也可能導(dǎo)致解壓失敗。
> 4. Java 版本不匹配。GZIP格式在不同的Java版本中實(shí)現(xiàn)可能有差異,如果壓縮時(shí)使用的是另一個(gè)Java版本,也可能解壓失敗。
> 5. 代碼存在bug。你的解壓代碼可能存在bug,導(dǎo)致無(wú)法正常讀取GZIP格式??梢詫?duì)比官方實(shí)現(xiàn),檢查代碼是否存在問(wèn)題。
為了解決這個(gè)報(bào)錯(cuò),你可以分別檢查以下幾點(diǎn):
> 1. 檢查原壓縮文件的確使用GZIP格式。如使用zip -d查看壓縮格式。
> 2. 使用文件校驗(yàn)器 檢查壓縮文件是否被篡改。
> 3. 在解壓前使用工具來(lái)檢查文件是否損壞。
> 4. 檢查壓縮和解壓所用的編碼格式是否一致。
> 5. 驗(yàn)證壓縮和解壓所用的Java版本是否匹配。
> 6. 對(duì)比官方GZIP解壓縮代碼,檢查你的解壓縮代碼是否存在bug。
> 7. 將原壓縮文件解壓后再重新壓縮,看是否仍然報(bào)該錯(cuò)。來(lái)排查是否是文件本身的問(wèn)題。 除此之外,還可以嘗試使用其他GZIP庫(kù)來(lái)解壓,或者直接用 unzip命令,看是否仍然報(bào)同樣的錯(cuò)誤。這可以排除代碼方面的問(wèn)題。
嗯,說(shuō)了一大堆有用的廢話,還是自己打斷點(diǎn)吧。
很快啊,我定位到封裝了發(fā)送http請(qǐng)求的方法中,在其中有一個(gè)解析相應(yīng)數(shù)據(jù)的方法EntityUtils.toString(response.getEntity(), "utf-8");
因?yàn)楸救碎喿x源碼的能力不強(qiáng),在這就不贅述底層邏輯了,總之就是這行報(bào)錯(cuò)了,一開(kāi)始覺(jué)得是我請(qǐng)求頭的問(wèn)題,改了又改,無(wú)果,通過(guò)各種套路GPT得到了以下回答:
> 問(wèn):如果響應(yīng)頭中缺少Content-Encoding會(huì)導(dǎo)致Not in GZIP format報(bào)錯(cuò)嗎
> 答:是的。如果響應(yīng)主體確實(shí)使用了gzip編碼,但響應(yīng)頭卻缺少Content-Encoding字段,這很容易導(dǎo)致Not in GZIP format的錯(cuò)誤。 具體的原因是: 由于缺少Content-Encoding字段,客戶端不知道響應(yīng)使用了gzip編碼。
> 嘗試使用gzip解碼器解碼主體內(nèi)容時(shí),會(huì)發(fā)現(xiàn)內(nèi)容并非有效的gzip編碼格式,就報(bào)Not in GZIP format的錯(cuò)誤。
> 所以如果響應(yīng)確實(shí)使用了gzip編碼,Content-Encoding字段就非常重要:
> - 沒(méi)有Content-Encoding字段,客戶端無(wú)法意識(shí)到響應(yīng)使用了gzip編碼
> - 嘗試使用gzip解碼器解碼主體內(nèi)容時(shí),會(huì)報(bào)Not in GZIP format錯(cuò)誤 相反,如果響應(yīng)主體內(nèi)容沒(méi)有使用gzip編碼,那么缺少Content-Encoding字段就不會(huì)報(bào)這個(gè)錯(cuò)。
> 所以,為了解決這個(gè)問(wèn)題,關(guān)鍵在于確保:
> 1. 響應(yīng)主體是否確實(shí)使用了gzip編碼
> 2. 響應(yīng)頭正確加入Content-Encoding: gzip字段
> 3. 然后使用gzip解碼器來(lái)解碼主體內(nèi)容 只有響應(yīng)主體確實(shí)使用gzip編碼、但響應(yīng)頭又缺少Content-Encoding字段的情況下, 才會(huì)導(dǎo)致Not in GZIP format錯(cuò)誤。 只有當(dāng)響應(yīng)真正不是gzip編碼的時(shí)候,這個(gè)錯(cuò)誤才不會(huì)出現(xiàn)。
通過(guò)它的解答,我開(kāi)始懷疑是對(duì)接方的問(wèn)題,于是乎,第二天上班找到對(duì)面負(fù)責(zé)人進(jìn)行禮貌問(wèn)候,不出五分鐘,真的非??欤沁叴饛?fù):好了
我(已黑化):???
白加班了。。。
由于是小公司沒(méi)什么話語(yǔ)權(quán),對(duì)接方還是上游,所以沒(méi)有仔細(xì)問(wèn)原因,但是我覺(jué)得大概率是響應(yīng)頭的問(wèn)題,如果大家有別的看法可以學(xué)術(shù)討論下。
其實(shí)這次問(wèn)題并沒(méi)有涉及到什么技術(shù)問(wèn)題,只是溝通存在問(wèn)題,這種情況我在開(kāi)發(fā)時(shí)也遇到很多次了,所以寫(xiě)代碼的同時(shí)也要注意及時(shí)溝通,遇到不明白的問(wèn)題問(wèn)同事,問(wèn)對(duì)接方,自己悶著是解決不了問(wèn)題的,問(wèn)問(wèn)問(wèn),問(wèn)到明白為止、問(wèn)到問(wèn)題解決為止。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)百度云文字識(shí)別接口代碼
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)百度云文字識(shí)別的接口代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11使用ElasticSearch6.0快速實(shí)現(xiàn)全文搜索功能的示例代碼
本篇文章主要介紹了使用ElasticSearch6.0快速實(shí)現(xiàn)全文搜索功能,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Java中使用開(kāi)源庫(kù)JSoup解析HTML文件實(shí)例
這篇文章主要介紹了Java中使用開(kāi)源庫(kù)JSoup解析HTML文件實(shí)例,Jsoup是一個(gè)開(kāi)源的Java庫(kù),它可以用于處理實(shí)際應(yīng)用中的HTML,比如常見(jiàn)的HTML格式化就可以用它來(lái)實(shí)現(xiàn),需要的朋友可以參考下2014-09-09Spring MVC 中獲取session的幾種方法(小結(jié))
這篇文章主要介紹了Spring MVC 中獲取session的幾種方法(小結(jié)),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Mybatis批量修改時(shí)出現(xiàn)報(bào)錯(cuò)問(wèn)題解決方案
這篇文章主要介紹了Mybatis批量修改時(shí)出現(xiàn)報(bào)錯(cuò)問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Java 通過(guò)AQS實(shí)現(xiàn)數(shù)據(jù)組織
這篇文章主要介紹了通過(guò)AQS實(shí)現(xiàn)數(shù)據(jù)組織,想了解AQS的同學(xué)可以參考下2021-04-04SpringBoot中的@ApiModelProperty注解作用
這篇文章主要介紹了SpringBoot中的@ApiModelProperty注解作用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01