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