Как получить 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(...)
? Спасибо заранее!
Ответы
Ответ 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);