0

Apache HtppClient を使用して HTTP GET を実行し、応答を読み取ろうとしています。私の現在の努力は次のようになります

    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、エラーが発生します。

原因: java.io.IOException: クローズされたストリームから読み取ろうとしました。

HttpClient v.4 の使用例を見つけるのに苦労しています。これは、私の Google 検索では、API がまったく異なる古いバージョンの例しか返されないためです。

4

3 に答える 3

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
}
于 2013-05-29T12:51:39.750 に答える
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;
}
于 2013-05-29T09:16:01.940 に答える
0

consume()

エンティティ コンテンツが完全に消費され、コンテンツ ストリームが存在する場合は閉じられるようにします。

閉じたストリームから読み込もうとしています

于 2013-05-29T08:48:06.257 に答える