Search code examples
apache-httpclient-4.xapache-httpcomponents

decompress Apache httpclient results


I'm using Apache HTTPClient 4.5.3 to make some HTTP requests, but I am getting a g-zipped response I have tried many things I found online but non of them worked. I still get gibberish when I print the response. Below are the relevant code. What do I need to do to get a human readable response?

static public CloseableHttpClient CreateHttpClient() {
    // return
    // HttpClients.custom().disableAutomaticRetries().setHttpProcessor(HttpProcessorBuilder.create().build())
    // .build();

    return HttpClientBuilder.create().disableAutomaticRetries()
            .setHttpProcessor(HttpProcessorBuilder.create().build()).build();
}

static public RequestConfig GetConfig() {
    return RequestConfig.custom().setSocketTimeout(READTIMEOUT).setConnectTimeout(CONNECTTIMEOUT)
            .setConnectionRequestTimeout(REQUESTTIMEOUT).build();
}

static public String updates() {
    String result = "";
    String url = "https://example.com";
    CloseableHttpClient httpClient = CreateHttpClient();
    CloseableHttpResponse response = null;
    URL urlObj;
    RequestConfig config = GetConfig();

    try {
        urlObj = new URL(url);

        HttpPost request = new HttpPost(url);
        request.setConfig(config);

        StringEntity params = new StringEntity("example");

        request.addHeader("Accept-Language", "en");
        request.addHeader("Content-Type", "application/json; charset=UTF-8");
        request.addHeader("Content-Length", String.valueOf(params.getContentLength()));
        request.addHeader("Host", urlObj.getHost());
        request.addHeader("Connection", "Keep-Alive");
        request.addHeader("Accept-Encoding", "gzip");

        request.setEntity(params);
        response = httpClient.execute(request);

        int responseCode = response.getStatusLine().getStatusCode();

        System.out.println("updates response code: " + responseCode);


        // BufferedReader rd = new BufferedReader(new
        // InputStreamReader(response.getEntity().getContent(), "UTF-8"));

        result = EntityUtils.toString(response.getEntity());
        // String line = "";
        // while ((line = rd.readLine()) != null) {
        // result.append(line);
        // }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (response != null)
                response.close();
            httpClient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return result;
}

Solution

  • You should get the content from the response entity which is an InputStream. Than you could create a String from that InputStream with BufferedReader

    HttpEntity entity = response.getEntity();
    if (entity != null) {
        InputStream instream = entity.getContent();
        String result = convertInputStreamToString(instream); 
        instream.close();
    }
    

    Write your own convertInputStreamToString. If you need help for doing that check here: Read/convert an InputStream to a String