簡體   English   中英

解釋來自 API 的 gzip 響應正文時出現錯誤:“java.util.zip.ZipException:不是 GZIP 格式”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM