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);
}
を私の残りの質問:
が更新され、実装は安全です、何かが自動的に接続を解除しますか?
どのような副作用がありますか?
これは私の実際の問題を解決しません。大容量のファイルではスケールされないので、コンテンツをバイト配列でバッファリングしないようにしたい。 – Reece
Apache HTTPクライアントがサーバーへの接続を閉じるため、ストリームが閉じられる。 RAMに保存するデータ量を少なくしたい場合は、ファイルにデータを書き込むためにconciderする必要があります。 – Bernard