繁体   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