2017-10-11 130 views
1

我從Swagger自動生成JAX-RS接口。 我使用Jersey 2.25.1。JAX-RS/Jersey 2文件下載 - 是否有服務器和生成客戶端代理的公共API

對於大多數使用情況,所有工作都很好。我們有相同的服務器和客戶端部件的接口。 客戶端從與org.glassfish.jersey.client.proxy.WebResourceFactory的接口生成。

現在我需要通過流式傳輸來實現文件下載(文件會很大,通常在千兆字節範圍內,因此需要流式傳輸)。

我可以使用下面的簽名服務器:

@GET 
@Path("/DownloadFile") 
@Produces({"application/octet-stream"}) 
StreamingOutput downloadFileUniqueId(); 

StreamingOutput不能很顯然,在客戶端使用。

JAX-RS/Jersey中是否有任何功能在服務器和客戶端之間具有通用接口?

我見過的上傳,這是可能的使用FormDataMultiPart,我想下載一個類似的解決方案......

+0

在客戶端代碼中,您必須讀取響應實體作爲輸入流 - InputStream responseStream = response.readEntity(InputStream.class);然後讀取此流以獲取實際的文件內容。 –

+0

嘗試使用Response返回類型,然後在客戶端代碼中,可以調用'response.get(InputStream.class)'' – vikarjramun

回答

0

好吧,發現使用javax.ws.rs.core.Response對象作爲返回類型的有效的解決方案:

Server代碼:

public Response downloadFile(String uniqueId){ 
    InputStream inputStream = filePersistenceService.read(uniqueId); 
    Response.ok(outputStream -> IOUtils.copy(inputStream, outputStream)).build() 

}

客戶端代碼:

Response response = client.downloadFile(uniqueId); 
InputStream resultInputStream = response.readEntity(InputStream.class); 

這適用於由org.glassfish.jersey.client.proxy.WebResourceFactory生成的客戶端。

相關問題