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