错误:“java.util.zip.ZipException:Not in GZIP format”当解释来自API的gzip响应正文时

kx7yvsdv  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(69)

目前,我正在尝试对基于mediawiki的API进行简单的get调用,特别是liquipedia.net。在他们的使用条款中,他们要求接受gzip编码,并且在打印响应头和状态代码时,我可以评估我的调用成功。然而,响应体打印出一个我不知道如何解释的难以理解的字符简介。我试图整合一些解压信息的方法,因为我假设我收到的信息可能仍然在. GZ表单中,但是我使用的方法通常会提供错误,说明数据不在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();
  }


这是我经常得到的一个响应体的例子
��
以及我收到的响应头
{{:status =[200],accept-ranges =[bytes],age =[0],cache-control =[private,must-revalidate,max-age = 0],content-disposition =[inline;文件名= api-result.json],内容编码=[gzip],内容类型=[application/json; charset = utf-8],日期=[2021年6月5日星期六23:56:40 GMT],配置器策略=[no-configurer-when-downgrade],服务器=[nginx],vary =[Accept-Encoding,Treat-as-Untrusted,Cookie],via =[1.1 varnish(Varnish/6.5)],x-cache =[MISS],x-content-type-options =[nosniff],x-frame-options =[DENY],x-xss-protection =[1; mode = block]}}
我想我可能错过了一些明显的东西,但因为我是一个新的工作与API的,我会感谢任何帮助,可以提供!

vltsax25

vltsax251#

我通过修改HttpResponse的T(类型)解决了这个问题,如下所示

HttpResponse<InputStream> response = client.send(request, BodyHandlers.ofInputStream());

字符串
然后,我使用GZIPInputStream解析数据并输出信息

InputStreamReader reader = new InputStreamReader(new GZIPInputStream(response.body()));

    while (true) {
      int ch = reader.read();
      if (ch==-1) {
         break;
      }
      System.out.print((char)ch);
    }

相关问题