在Javascript中,如何在窗口位置重定向Ajax响应
In Javascript how can I redirect an Ajax response in window location
我目前有以下工作代码(有角度,但适用于任何JS框架):
var url = '/endpoint/to/my/file';
$http({
method: 'GET',
url: url
})
.success(function(jdata) {
window.location = url;
})
.error(function(je){
// display errors on page
});
以上是在表单完成并用户单击"提交"后调用的(实际情况比这更复杂,但这是相同的想法)。我以异步方式进行表单检查,因此不会重新加载页面。
如果请求成功,则返回一个二进制文件(pdf文件);如果不成功,则请求返回一个400 BadRequest,其中包含JS格式的错误。因此,我所做的是,如果成功,我重定向到同一个url以获得PDF,否则我会得到JSON错误对象并对其进行处理。
如果请求成功,我如何避免提出两个请求?
- 注1:在后端,我只想保留一条可以完成所有任务的路由,检查并返回PDF
- 注2:在我看来,目前的情况相当不错,因为我有一个异步表单检查,如果成功,文件将直接在浏览器中下载,因为我在成功响应的HTTP标头中有
"CONTENT-DISPOSITION" -> "attachment"
更新:Emile要求的有关体系结构的其他信息:在我的用例中,我有一个端点来检查输入(和其他外部需求)。出于安全原因,如果所有要求都没有得到满足,我就无法输出PDF,所以我必须在交付文件之前进行检查(文件是自动生成的)。因此,拥有两个端点将是多余的,并增加一些不必要的复杂性。
在写作过程中,我认为另一种解决方案可以是在进行检查时在端点上传递一个参数,这样,如果成功,它就会停止并不生成PDF,然后重定向到同一个端点,而不带有将输出PDF的标志。所以我做了两次检查,但只加载(和生成——这是资源密集型的)文件一次,而且我只有一个端点。。。
这是经过调整的代码:
var url = '/endpoint/to/my/file';
$http({
method: 'GET',
url: url+'?check'
})
.success(function(jdata) {
window.location = url;
})
.error(function(je){
// display errors on page
});
在后端(我使用Play框架/Scala)
def myendpoint(onlyDoCheck: Boolean = false) = Action{implicit request =>
myForm.bindFromRequest.fold(
e => BadRequest(myErrors),
v => if(onlyDoCheck) Ok(simpleOkResponse) else Ok(doComputationgeneratefileandoutputfile)
)
}
真正的交易
你能做的最好的事情就是拆分你的端点。
- 一个是为了形式和在不刷新的情况下出现错误的便利性
- 然后,一旦成功,重定向到只下载文件的另一个端点
如果该文件在磁盘上,并且不是自动生成的,并且需要经过身份验证才能下载,那么您可以将该文件隐藏在一个正常的端点后面,进行检查,并使用nginx的X-Accel-Redirect
标头或使用apache的X-Sendfile
返回该文件。
黑客
免责声明:这更像是一个黑客攻击,而不是最佳解决方案。正如@Iceman所提到的,Safari、IE、Safari iOS、Opera mini和一些这样的浏览器不支持这个特定的规范。
在服务器端端点中,如果文件可用且没有错误,则可以将头设置为文件的内容类型(如'application/pdf'
),以便自动开始下载。
如果有错误,不要设置头,并返回错误的json,通过javascript通知用户。
由于我们不知道背后是什么,这里有一个python(Django)示例:
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename=your_filename.pdf'
response.write(repport.printReport(participantId))
return response
您可以在ajax成功回调中处理响应:
$.ajax({
url: 'endpoint.php',
success: function(data) {
var blob = new Blob([data]);
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = "filename.pdf";
link.click();
}
});
你也可以试试这个答案中提到的jQueryfileDownload插件。
- 如何在使用Passport.js和Sails.js注册后重定向到特定位置
- 如何在重定向 URL 的标头中拦截和获取位置
- 链接内的内容可编辑块,如何防止重定向,但让文本选择插入符号位置更改
- HTML重定向到错误的位置
- JavaScript位置重定向暂停Chrome上的AJAX调用
- Firefox弹出窗口“;这个网页被重定向到一个新的位置“;在每个requestPromise ajax调用上,有什么方
- 标头(位置:)通过AJAX未重定向
- 按地理位置纬度和经度切换大小写重定向
- 重定向到新页面,但记住原始位置
- 在具有标头位置的重定向步骤中检测第一个脚本
- 安卓网页视图位置重定向
- 如果当前网址不包含位置搜索,请重定向到主页
- 如何删除未定义的对象错误并根据位置重定向用户
- 基于页面标题/位置的重定向
- 停止窗口.位置.替换重定向
- 根据用户位置重定向网站
- 在窗口后预选择HTML选择选项.位置重定向
- 使用“响应”时保持滚动位置.重定向(Request.RawUrl)
- 在Javascript中,如何在窗口位置重定向Ajax响应
- 窗口.位置重定向在Android中不起作用