我目前有以下内容working一段代码(角度但适用于任何 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:在我看来,目前的情况非常整洁,因为我有一个异步表单检查,如果成功,文件会直接在浏览器中下载,因为我有
"CONTENT-DISPOSITION" -> "attachment"
在成功响应的 HTTP 标头中
更新:根据 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)
)
}