[英]Error: "java.util.zip.ZipException: Not in GZIP format" when interpreting gzip response body from API
目前,我正在嘗試對基於 mediawiki 的 API,特別是 liquipedia.net 進行簡單的調用。 在他們的使用條款中,他們要求接受 gzip 編碼,並且在打印響應標頭和狀態代碼后,我可以判斷我的調用是否成功。 但是,響應正文會打印出我不知道如何解釋的難以理解的字符模糊。 我嘗試集成一些解壓信息的方法,因為我假設我收到的信息可能仍然在.GZ 形式中,但是我使用的方法通常會提供錯誤 state 數據不在 gzip 形式內或什么都沒有用任何信息完成。
這是建立連接的基本方法,並嘗試簡單地打印響應信息。
public static void GET(String address) throws IOException, InterruptedException
{
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(address))
.header("Accept-Encoding", "Gzip")
.header("User-Agent", "RosterBot")
.GET()
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
HttpHeaders responseHeader = response.headers();
System.out.println(responseHeader.toString());
System.out.println(response.statusCode());
System.out.println(decompress(response.body().getBytes()));
}
這是我使用的一種壓縮方法,並且看到其他一些使用
public static byte[] compress(final String str) throws IOException {
System.out.println(b.toString());
if ((str == null) || (str.length() == 0)) {
return null;
}
ByteArrayOutputStream obj = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(obj);
gzip.write(str.getBytes("UTF-8"));
gzip.flush();
gzip.close();
return obj.toByteArray();
}
以及解壓方式
public static String decompress(final byte[] compressed) throws IOException {
final StringBuilder outStr = new StringBuilder();
if ((compressed == null) || (compressed.length == 0)) {
return "";
}
final GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(compressed));
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(gis, "UTF-8"));
String line;
while ((line = bufferedReader.readLine()) != null) {
outStr.append(line);
}
return outStr.toString();
}
這是我經常獲得的響應主體的示例
%�1���lM,��^aag,/J�p��ww��^d{p-����f�4��}������Z
以及我收到的響應標頭
{ {:status=[200],accept-ranges=[bytes],age=[0],cache-control=[private,must-revalidate,max-age=0],content-disposition=[inline; 文件名=api-result.json],內容編碼=[gzip],內容類型=[應用程序/json; charset=utf-8], date=[Sat, 05 Jun 2021 23:56:40 GMT], referrer-policy=[no-referrer-when-downgrade], server=[nginx], vary=[Accept-Encoding,視為不受信任,Cookie],via=[1.1 varnish (Varnish/6.5)],x-cache=[MISS],x-content-type-options=[nosniff],x-frame-options=[DENY] , x-xss-保護=[1; 模式=塊]} }
我想我可能會遺漏一些明顯的東西,但由於我對使用 API 有點陌生,我將不勝感激可以提供的任何幫助!
我通過像這樣修改我的 HttpResponse 的 T (類型)解決了這個問題
HttpResponse<InputStream> response = client.send(request, BodyHandlers.ofInputStream());
之后,我用 GZIPInputStream 和 output 解析了數據信息
InputStreamReader reader = new InputStreamReader(new GZIPInputStream(response.body()));
while (true) {
int ch = reader.read();
if (ch==-1) {
break;
}
System.out.print((char)ch);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.