How to get HttpClient returning status code and response body?

apache-httpclient-4.x, http, java

Solution

Don't provide the handler to `execute`.

Get the `HttpResponse` object, use the handler to get the body and get the status code from it directly

try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
    final HttpGet httpGet = new HttpGet(GET_URL);

    try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
        StatusLine statusLine = response.getStatusLine();
        System.out.println(statusLine.getStatusCode() + " " + statusLine.getReasonPhrase());
        String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
        System.out.println("Response body: " + responseBody);
    }
}

For quick single calls, the fluent API is useful:

Response response = Request.Get(uri)
        .connectTimeout(MILLIS_ONE_SECOND)
        .socketTimeout(MILLIS_ONE_SECOND)
        .execute();
HttpResponse httpResponse = response.returnResponse();
StatusLine statusLine = httpResponse.getStatusLine();

For older versions of java or httpcomponents, the code might look different.

Problem

I am trying to get Apache HttpClient to fire an HTTP request, and then display the HTTP response code (200, 404, 500, etc.) as well as the HTTP response body (text string). It is important to note that I am using `v4.2.2` because most HttpClient examples out there are from `v.3.x.x` and the API changed greatly from version 3 to version 4. Unfortunately I've only been able to get HttpClient returning the status code or the response body (but not both). Here's what I have: ``` // Getting the status code. HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet("http://whatever.blah.com"); HttpResponse resp = client.execute(httpGet); int statusCode = resp.getStatusLine().getStatusCode(); // Getting the response body. HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet("http://whatever.blah.com"); ResponseHandler<String> handler = new BasicResponseHandler(); String body = client.execute(httpGet, handler); ``` So I ask: Using the `v4.2.2` library, how can I obtain both status code and response body from the same `client.execute(...)` call?

Original source

Related problems