2016-05-10 19 views
0

Apache HTTPクライアントを使用して、レスポンスにファイルを返すWebサービスを使用しています。HTTP応答ストリームを参照してオブジェクトを返す

投稿リクエストを行い、そのリクエストから返されたファイルのbyte[]を含むCustomServiceResult.javaを返すメソッドがあります。

明らかに、私はInputStreamを返すことをお勧めします。

以下のコードはどのように実装したいのですか?現在、私はInputStreamをバッファし、そのバイト配列でCustomServiceResultを構築しています。

InputStreamを返すときの動作は、ストリームが閉じていることです。これは理にかなっていますが理想的ではありません。

私は何をしようとしているのパターンが共通していますか?

InputStreamを保持して、CustomServiceResultのコンシューマがファイルを受信できるようにするにはどうすればよいですか?

public CustomServiceResult invoke(HttpEntity httpEntity) throws IOException { 
    try (CloseableHttpClient httpClient = HttpClients.createDefault()) { 
     HttpPost httppost = new HttpPost(url + MAKE_SEARCHABLE); 
     httppost.setEntity(httpEntity); 

     try (CloseableHttpResponse response = httpClient.execute(httppost)) { 
      HttpEntity resEntity = response.getEntity(); 

      int statusCode = response.getStatusLine().getStatusCode(); 
      if (statusCode != 200 || resEntity.getContent() == null) { 
       throw new CustomServiceException(IOUtils.toString(resEntity.getContent(), "utf-8"), 
         statusCode); 
      } 

      // resEntity.getContent() is InputStream 
      return new CustomServiceResult(resEntity.getContent()); 
     } 
    } 
} 


public class CustomServiceResult { 

    private InputStream objectContent; 

    public CustomServiceResult(InputStream objectContent) { 
     this.objectContent = objectContent; 
    } 

    public InputStream getObjectContent() { 
     return objectContent; 
    } 

} 

UPDATE

私はこの作業を取得し、最終的に接続を閉じたリソース文で私の試みの動作を理解するために管理。

これは私が後にした結果を得るために取ったアプローチです。

public CustomServiceResult invoke(HttpEntity httpEntity) throws IOException { 
    CloseableHttpClient httpClient = HttpClients.createDefault(); 
    HttpPost httppost = new HttpPost(url); 
    httppost.setEntity(httpEntity); 

    CloseableHttpResponse response = httpClient.execute(httppost); 
    HttpEntity resEntity = response.getEntity(); 

    int statusCode = response.getStatusLine().getStatusCode(); 
    if (statusCode != 200 || resEntity.getContent() == null) { 
     throw new CustomServiceException(IOUtils.toString(resEntity.getContent(), "utf-8"), 
       statusCode); 
    } 

    return new CustomServiceResult(resEntity.getContent()); 
} 

この方法によって、私がテストしてきた方法です、:

@Test 
public void testCreateSearchablePdf() throws Exception { 
    CustomServiceResult result = client.downloadFile(); 
    FileOutputStream os = new FileOutputStream("blabla.pdf"); 
    IOUtils.copy(result.getObjectContent(), os); 
} 

を私の残りの質問:

  1. が更新され、実装は安全です、何かが自動的に接続を解除しますか?

  2. どのような副作用がありますか?

答えて

-1

ByteArrayInputStreamを使用すると、バイト配列をInputstreamに戻すことができます。

+0

これは私の実際の問題を解決しません。大容量のファイルではスケールされないので、コンテンツをバイト配列でバッファリングしないようにしたい。 – Reece

+0

Apache HTTPクライアントがサーバーへの接続を閉じるため、ストリームが閉じられる。 RAMに保存するデータ量を少なくしたい場合は、ファイルにデータを書き込むためにconciderする必要があります。 – Bernard

関連する問題