JAX-RS/Jersey 2文件下载 - 是否有服务器和生成客户端代理的公共API
问题描述:
我从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
,我想下载一个类似的解决方案......
答
好吧,发现使用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
生成的客户端。
在客户端代码中,您必须读取响应实体作为输入流 - InputStream responseStream = response.readEntity(InputStream.class);然后读取此流以获取实际的文件内容。 –
尝试使用Response返回类型,然后在客户端代码中,可以调用'response.get(InputStream.class)'' – vikarjramun