Подтвердить что ты не робот

Как получить HttpClient, возвращающий статус-код и тело ответа?

Я пытаюсь заставить Apache HttpClient запускать HTTP-запрос, а затем отображать код ответа HTTP (200, 404, 500 и т.д.), а также тело ответа HTTP (текстовую строку). Важно отметить, что я использую v4.2.2, потому что большинство примеров HttpClient из v.3.x.x, и API сильно изменился с версии 3 на версию 4.

К сожалению, мне удалось вернуть HttpClient код статуса или тела ответа (но не оба).

Вот что у меня есть:

// 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);

Итак, я спрашиваю: Используя библиотеку v4.2.2, как я могу получить как код состояния, так и тело ответа от одного и того же вызова client.execute(...)? Спасибо заранее!

4b9b3361

Ответ 1

Не предоставляйте обработчик execute.

Получить объект HttpResponse, использовать обработчик, чтобы получить тело и получить от него код состояния

HttpResponse response = client.execute(httpGet);
String body = handler.handleResponse(response);
int code = response.getStatusLine().getStatusCode();

Ответ 2

Вы можете избежать BasicResponseHandler, но использовать HttpResponse для получения статуса и ответа как строки.

HttpResponse response = httpClient.execute(get);

// Getting the status code.
int statusCode = response.getStatusLine().getStatusCode();

// Getting the response body.
String responseBody = EntityUtils.toString(response.getEntity());

Ответ 3

BasicResponseHandler выдает, если статус не 2xx. Смотрите javadoc.

Вот как я это сделаю:

HttpResponse response = client.execute( get );
int code = response.getStatusLine().getStatusCode();
InputStream body = response.getEntity().getContent();
// Read the body stream

Или вы также можете написать ResponseHandler, начиная с источника BasicResponseHandler, который не бросает, когда статус не равен 2xx.

Ответ 4

Свободный API-интерфейс фасада:

Response response = Request.Get(uri)
        .connectTimeout(MILLIS_ONE_SECOND)
        .socketTimeout(MILLIS_ONE_SECOND)
        .execute();
HttpResponse httpResponse = response.returnResponse();
StatusLine statusLine = httpResponse.getStatusLine();
if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
    // 响应内容编码自适应?(好像没那么智能)
    String responseContent = EntityUtils.toString(
            httpResponse.getEntity(), StandardCharsets.UTF_8.name());
}

Ответ 5

Если вы используете Spring

        return  new ResponseEntity<String>("your response", HttpStatus.ACCEPTED);