2013-05-29 4 views
0

Я пытаюсь использовать Apache HtppClient для выполнения HTTP GET и чтения ответа. Моя текущая работа выглядит следующим образомВыполнение HTTP GET с Apache HttpClient v.4

def listAlertsUrl = "http://example.com/whatever" 
    HttpGet listAlertsRequest = new HttpGet(listAlertsUrl) 
    HttpResponse response = httpClient.execute(listAlertsRequest) 
    HttpEntity entity = response.entity 
    EntityUtils.consume(entity) 

    // newReader() is a method that Groovy adds to InputStream 
    Reader jsonResponse = entity.content.newReader() 

    try { 
     // do stuff with the Reader 
    } finally { 
     jsonResponse.close() 
    } 

Однако, когда я пытаюсь использовать Reader я получаю ошибку:

Caused by: java.io.IOException: Attempted read from closed stream.

Я изо всех сил, чтобы найти примеры того, как использовать HTTPClient v.4, потому что мои поисковые запросы Google возвращают только примеры версий olderr, которые имеют совершенно разные API.

+0

Вы смотрели на их JUnit тестов: https://github.com/apache/httpclient/tree/trunk/httpclient/src/test/java/ org/apache/http/client/методы? –

+0

Почему вы потребляете сущность? – njzk2

+0

@ BorisPavlović Я не вижу в этих тестах соответствующих примеров, но спасибо в любом случае –

ответ

0

consume()

Ensures that the entity content is fully consumed and the content stream, if exists, is closed.

Вы пытаетесь читать из замкнутого потока

0

Вы можете сделать это следующим образом:

String getUrl() throws IOException{ 
    HttpClient client = new DefaultHttpClient(); 
    HttpGet listAlertsRequest = new HttpGet("http://www.google.com"); 
    HttpResponse response =client.execute(listAlertsRequest); 

    String resultBody = EntityUtils.toString(response.getEntity()); 
    EntityUtils.consume(response.getEntity()); 
    return resultBody; 
} 
1

Как указано в комментариях, и в другом ответе, удалите EntityUtils.consume(entity) линия. Кроме того, вместо использования метода newReader я бы рекомендовал withReader (он автоматически обрабатывает закрытие потока). Я также рекомендую указать кодировку при создании читателя

def listAlertsUrl = 'http://example.com/whatever' 
HttpGet listAlertsRequest = new HttpGet(listAlertsUrl) 
HttpResponse response = httpClient.execute(listAlertsRequest) 
HttpEntity entity = response.entity 
// specify the encoding of HTTP response instead of using default JVM encoding 
entity.content.withReader(entity.contentEncoding.value) { jsonResponse -> 
    // do stuff with the Reader 
} 
Смежные вопросы