我从Swagger自动生成JAX-RS接口。 我使用Jersey 2.25.1。
对于大多数用例,一切正常。我们为服务器和客户端部件提供相同的接口。
客户端是使用org.glassfish.jersey.client.proxy.WebResourceFactory
。
现在我需要通过流媒体实现文件下载(文件很大,通常在千兆字节范围内,因此需要流式传输)。
我可以为服务器使用以下签名:
@GET
@Path("/DownloadFile")
@Produces({"application/octet-stream"})
StreamingOutput downloadFileUniqueId();
但StreamingOutput
显然无法在客户端使用。
JAX-RS / Jersey中是否有任何功能在服务器和客户端之间建立通用接口?
我已经看过上传了,可以使用FormDataMultiPart
,我想要一个类似的下载解决方案...
答案 0 :(得分:1)
好的,找到了一个使用javax.ws.rs.core.Response
对象作为返回类型的工作解决方案:
服务器代码:
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
生成的客户端。