我有相应的代码通过javascript和ajax下载zip文件。在后端,我使用REST资源和Java来处理请求。这是下载文件的以下js代码
var urlDownload = "/test/download/";
$.ajax({
url: urlDownload ,
async:true,
type: 'GET',
success: function (data) {
if (data != undefined) {
window.location = urlDownload;
}
},
error : function(xhr, textStatus, exception) {
// display the error message
return true;
},
cache: false
});
}
以下是处理来自UI的请求的相应JAVA-REST代码
@Metric(op = "get the file")
@Path("/test/download/")
@GET
@Produces("application/zip")
public Response downloadZIP() {
System.out.println("Downloading the zip file");
try{
/ .....
.......
Logic to create the zip file and return the FILE object
......
...... /
ResponseBuilder response = Response.ok((Object) file);
response.header("Content-Disposition",
"attachment; filename=test.zip");
return response.build();
} catch (Exception e) {
// return an error message
}
}
所以,问题是print语句被执行了两次,即我创建zip的整个业务逻辑也被执行了两次。为了进一步调试,我在javascript中注释掉以下行 window.location = urlDownload; ,我发现它现在只执行一次,但显然文件没有被下载,因为所需的JS代码是评论说。
所以,我的问题是为什么REST资源正在执行两次?
是因为 GET和下载网址是相同的,并且两者都是相同的网址,因此当请求来自用户界面时,它会被映射到同一资源吗?
除了创建不同的REST资源(两个不同的URL)之外,有没有办法绕过它,即一个用于执行所有业务逻辑的 GET 请求,另一个资源将处理下载部分只在第一个资源执行后或是否有其他方式使用JS或ajax下载文件?
答案 0 :(得分:0)
window.location = urlDownload; 是javascript中以编程方式在导航器上加载新页面的方式,所以你要做的是 请求您的Web服务(第一次调用),然后在导航器上输入Web服务的地址,这将进行第二次调用以将所述Web服务加载为网页。
答案 1 :(得分:0)
AJAX GET本身将调用下载代码。 window.location = urlDownload不需要。它将再次调用相同的URL。那么AJAX的目的是什么呢。您是否在没有window.location = urlDownload的情况下检查了它是否调用了下载代码?