在项目中遇到问题,要求动态拼接uri下载文件。但是由于项目的安全拦截导致window.location.href 和 window.open等新建窗口的方法都不行。
无意间百度到了通过form表单来下载的方法,具体如下。
1,form的action设置为接口地址,method设置为post,Post到后台的数据设置为input的属性 name = key,value = value的形式,如果有多个key、value的值要传递,那么就设置多个input来分别储存单个的key、value;
2, 如果请求的接口可以不需要参数,那么input还是必须要一个,如果不要得话 会引起接口报错
原理:form的action相当于一个浏览器本页签/页面的一个请求,不会被后台,前台的路由拦截。所以能够提交成功。
注意点:如果设置method为get,在action中的uri添加了参数的话,想用这个参数替代input的key、value形式来提交到后台,这参数是没有效果的,后台拿不到这些参数,真正的参数还是以input的name、value的形式储存,在submit方法执行后传递到后台。
代码:
POST
let idInput = ary.map(item => {
return `<input type='hidden' name='idList' value=${item.id}/>`;
}).join('');
let url = `http://${pkg.config.devHost +":"+pkg.config.devPort}/api/entity/manager/export`
$(`<form method='get' action='${url}'></form>`)
.appendTo('body')
.HTML(idInput)
.submit()
.remove();