我的应用程序向某些api服务发出http请求,该服务返回一个gzip压缩响应.如何确保响应确实是gzip格式?我很困惑为什么在提出请求后我没有解压缩它.
以下是我的代码:
public static String streamToString(InputStream stream) { BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); StringBuilder sb = new StringBuilder(); String line; try { while ((line = reader.readLine()) != null) { sb.append(line).append("\n"); } } catch (IOException e) { logger.error("Error while streaming to string: {}", e); } finally { try { stream.close(); } catch (IOException e) { } } return sb.toString(); } public static String getResultFromHttpRequest(String url) throws IOException { // add retries, catch all exceptions HttpClient httpclient = new DefaultHttpClient(); HttpGet httpGet; HttpResponse httpResponse; InputStream stream; try { httpGet = new HttpGet(url); httpGet.setHeader("Content-Encoding", "gzip, deflate"); httpResponse = httpclient.execute(httpGet); logger.info(httpResponse.getEntity().getContentEncoding()); logger.info(httpResponse.getEntity().getContent()); if (httpResponse.getStatusLine().getStatusCode() == 200) { stream = httpResponse.getEntity().getContent(); return streamToString(stream); } } catch (IllegalStateException e) { logger.error("Error while trying to access: " + url, e); } return ""; }
也许它会自动解压缩,但我希望至少看到一些迹象.
嗨,我迟到了,但这个答案可能会被用来面对同样的问题.默认情况下,内容在响应中解压缩.因此,您必须使用以下代码禁用默认压缩:
CloseableHttpClient client = HttpClients.custom() .disableContentCompression() .build(); HttpGet request = new HttpGet(urlSring); request.setHeader(HttpHeaders.ACCEPT_ENCODING, "gzip"); CloseableHttpResponse response = client.execute(request, context); HttpEntity entity = response.getEntity(); Header contentEncodingHeader = entity.getContentEncoding(); if (contentEncodingHeader != null) { HeaderElement[] encodings =contentEncodingHeader.getElements(); for (int i = 0; i < encodings.length; i++) { if (encodings[i].getName().equalsIgnoreCase("gzip")) { entity = new GzipDecompressingEntity(entity); break; } } } String output = EntityUtils.toString(entity, Charset.forName("UTF-8").name());