目前,我正在尝试对基于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的,我会感谢任何帮助,可以提供!
1条答案
按热度按时间vltsax251#
我通过修改HttpResponse的T(类型)解决了这个问题,如下所示
字符串
然后,我使用GZIPInputStream解析数据并输出信息
型