0
我正在使用Apache HTTP客戶端來使用返回響應中的文件的web服務。參考HTTP響應流返回對象
我有一個方法發出帖子請求並返回一個CustomServiceResult.java
,其中包含從該請求返回的文件byte[]
。
但我更願意返回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 Client想要關閉到服務器的連接,因此流關閉。如果你想在RAM中保留較少的數據,你應該將數據寫入文件。 – Bernard