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

В чем разница между CloseableHttpResponse.close() и httpPost.releaseConnection()?

CloseableHttpResponse response = null;
try {
    // do some thing ....
    HttpPost request = new HttpPost("some url");
    response = getHttpClient().execute(request);
    // do some other thing ....
} catch(Exception e) {
    // deal with exception
} finally {
    if(response != null) {
        try {
            response.close(); // (1)
        } catch(Exception e) {}
        request.releaseConnection(); // (2)
    }
}

Я сделал запрос http, как указано выше.

Для освобождения основного соединения правильно ли вызывать (1) и (2)? а какая разница между двумя вызовами?

4b9b3361

Ответ 1

Короткий ответ:

request.releaseConnection() освобождает базовое HTTP-соединение, чтобы позволить ему повторно использовать. response.close() закрывает поток (а не соединение), этот поток - это содержимое ответа, которое мы передаем из сетевого сокета.

Длительный ответ:

Правильный шаблон, который следует придерживаться в любой последней версии > 4.2 и, возможно, еще до этого, не должен использовать releaseConnection.

request.releaseConnection() освобождает базовое httpConnection, поэтому запрос может быть повторно использован, однако в документе Java говорится:

Удобный метод для упрощения миграции из API HttpClient 3.1...

Вместо того, чтобы освобождать соединение, мы гарантируем, что контент ответа полностью потребляется, что, в свою очередь, обеспечивает освобождение соединения и готовность к повторному использованию. Ниже приведен краткий пример:

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://targethost/homepage");
CloseableHttpResponse response1 = httpclient.execute(httpGet);
try {
    System.out.println(response1.getStatusLine());
    HttpEntity entity1 = response1.getEntity();
    // do something useful with the response body
    String bodyAsString = EntityUtils.toString(exportResponse.getEntity());
    System.out.println(bodyAsString);
    // and ensure it is fully consumed (this is how stream is released.
    EntityUtils.consume(entity1);
} finally {
    response1.close();
}