错误:从 API 解释 gzip 响应正文时"java.util.zip.ZipException: Not in GZIP format"



目前我正在尝试对基于mediawiki的API,特别是liquipedia.net进行简单的get调用。在他们的使用条款中,他们要求接受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();
}

下面是一个我经常获得的响应体的例子

%�1.� ��lM!��^aag,/J�p��ww��^d{p-���f�4.��}�����Z

以及我接收的响应标头

{:status=[200],accept ranges=[bytes],age=[0],缓存控制=[private,必须重新验证,最大年龄=0],内容处置=[inline;filename=api result.json],内容编码=[gzip],内容类型=[application/json;charset=utf-8],日期=[Sat,05 Jun 2021 23:56:40 GMT],引用者策略=[降级时无引用者],服务器=[nginx],varie=[接受编码,视为不受信任,Cookie],via=[1.1清漆(varnish/6.5(],x-cache=[MISS],x-content-type-options=[nosniff],x-frame-options=[DENY],x-xss-protection=[1;mode=block]}}

我想我可能会错过一些明显的东西,但由于我对使用API有点陌生,我将感谢您提供的任何帮助!

我通过像一样修改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);
}

相关内容

最新更新