能否使用fetch()不跟随重定向且避免不透明响应?
能否使用fetch()不跟随重定向且不返回不透明响应?
可以实现,但要区分同域和跨域场景:
同域请求场景
使用redirect: "manual"时,同域请求的响应完全可以拿到真实的状态码(比如302)和重定向目标地址,不会返回不透明响应。你之前代码里status总是0,大概率是请求涉及跨域导致的浏览器安全限制。
正确的同域请求示例:
fetch("/submit", { redirect: "manual" }) .then(response => { if (response.status === 302) { console.debug("检测到302重定向,目标地址:", response.headers.get("Location")); // 此处可判定请求成功(非5xx错误) } else if (response.ok) { console.debug("请求成功,无重定向"); } else { console.debug("请求失败,状态码:", response.status); } }) .catch(error => { console.error(error); });
跨域请求场景
如果是跨域请求,出于安全限制,浏览器会返回opaque-redirect类型的响应,此时status为0,无法获取真实状态码和重定向地址。这种情况下没法直接通过fetch检测重定向,可行的替代方案是:
- 借助同域代理转发请求:前端请求自己的同域服务端,由服务端去请求跨域接口,再把完整的响应信息返回给前端
- 提前和后端约定接口行为,通过其他标识判断是否触发重定向
内容的提问来源于stack exchange,提问作者hawk
相关产品推荐
相关产品推荐

