Java 异步下载zip文件
我目前正在使用Jersey 2.13。我希望客户端从服务器下载一个zip文件,我希望服务器在下载完成后删除该文件。因此,我尝试了AsyncResponse,因此我可以注册CompletionCallback,以便知道下载已经完成。对于我当前的代码,客户端得到:“失败:HTTP错误代码:415” 服务器代码为:Java 异步下载zip文件,java,asynchronous,jersey,jax-rs,Java,Asynchronous,Jersey,Jax Rs,我目前正在使用Jersey 2.13。我希望客户端从服务器下载一个zip文件,我希望服务器在下载完成后删除该文件。因此,我尝试了AsyncResponse,因此我可以注册CompletionCallback,以便知道下载已经完成。对于我当前的代码,客户端得到:“失败:HTTP错误代码:415” 服务器代码为: @GET @Path("/{id}") @Produces({"application/zip"}) public void getResourceTree(@Suspended fina
@GET
@Path("/{id}")
@Produces({"application/zip"})
public void getResourceTree(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id) throws IOException{
asyncResponse.register(new CompletionCallback() {
@Override
public void onComplete(Throwable throwable) {
if (throwable == null) {
// no throwable - the processing ended successfully
// (response already written to the client)
// Delete temporary zip file...
} else {
throw new UnexpectedException("The user did not receive the zip file in path:"+ getResourceTreeZipName(id) +" successfully");
}
}
});
new Thread(new Runnable() {
@Override
public void run() {
File file = createZipFile(id);
asyncResponse.resume(Response.ok((Object) file).build());
}
}).start();
}
客户端代码为:
private File downloadZipFile(String resourceId){
Client client = Client.create();
WebResource serverWebResource = client.resource(serverURI+"/"+resourceId);
ClientResponse response = serverWebResource.accept("application/zip").get(ClientResponse.class);
InputStream in = response.getEntityInputStream();
//Create and return the zip file from the input stream...
}
我做错了什么?当GET with accept头调用该对象时,是否尝试使用其他REST工具,例如Postman,并检查服务器是否返回了正确的对象?我要做的第二件事是调试客户端并检查是否在创建对象后立即设置了header accept。您如何使用async?您是对的,显然我使用的是Jersey 2.13,但您使用的是2.13中不可用的旧客户端API。这怎么可能?它们是两种不同的应用程序吗?无论如何,我无法重现这个问题,尽管我正在使用新的客户端API。我不确定这是否有区别。我想这是不可能的。。。我解决了一些错误的依赖性问题,现在服务器工作正常。我将根据新的API更改客户端,希望它也会很好,谢谢您的帮助!