Fetch API - 重定向有什么用:手动
Fetch API - What's the use of redirect: manual
我最近一直在玩 Javascript Fetch API。据我了解,默认情况下所有重定向都是透明处理的,最后我从重定向链中的最后一次调用得到响应。
但是,我可以使用 {redirect: 'manual'} 调用 fetch,在这种情况下,它会 return 一个没有可用信息的不透明重定向响应。来自 https://fetch.spec.whatwg.org/#concept-filtered-response-opaque-redirect
An opaque-redirect filtered response
is a filtered response whose type is "opaqueredirect", status is 0, status message is the empty byte sequence, header list is empty, body is null, and trailer is empty.
https://fetch.spec.whatwg.org/#http-fetch 表示如果重定向设置为 'manual':
,响应将变为不透明重定向
Switch on request’s redirect mode:
...
- manual
Set response to an opaque-redirect filtered response whose internal response is actualResponse.
规范还说:
In other words, an opaque filtered response and an opaque-redirect filtered response are nearly indistinguishable from a network error.
鉴于所有这些,为什么在使用 Fetch API 时将一组重定向到手动?对我来说,这似乎毫无用处。是否存在有用的用例?
简短的回答是:除非你像 https://github.com/whatwg/fetch/issues/66 那样用 service-worker 代码做一些事情,否则你永远不需要 redirect: 'manual'
.
更长的答案:
HTML spec requires 浏览器在浏览器开始导航到资源时首先将重定向模式设置为 manual
。这是 manual
重定向模式在任何规范中的唯一用途。
但是因为 Fetch API 本质上暴露了浏览器内部用于提取的相同原语,所以它暴露了 manual
重定向模式。然而,仅仅因为 API 公开了一个特定的原语并不意味着该原语在前端代码中有很好的用途。
规范曾经要求即使您 可以 使用 redirect: 'manual'
调用 API,如果您这样做,浏览器也会抛出错误 — 因为那时没有人除了浏览器进行导航之外,还没有提供任何有效的理由来设置它。
但是由于 https://github.com/whatwg/fetch/issues/66,该行为发生了变化,这给出了一个(角落)案例,其中服务工作者代码中需要 redirect: 'manual'
。
您可以在 Fetch API 中设置但在 Web 应用程序代码中几乎没有用处的类似情况是 mode: 'no-cors'
。最初添加它只是因为浏览器将它用于某些请求,所以 Fetch API 公开了它。但这是另一种情况,它只对服务工作者具有有限的效用——用于缓存响应以便稍后按原样返回,而无需检查响应(mode: 'no-cors'
阻止网络应用程序代码执行此操作)。
我最近一直在玩 Javascript Fetch API。据我了解,默认情况下所有重定向都是透明处理的,最后我从重定向链中的最后一次调用得到响应。
但是,我可以使用 {redirect: 'manual'} 调用 fetch,在这种情况下,它会 return 一个没有可用信息的不透明重定向响应。来自 https://fetch.spec.whatwg.org/#concept-filtered-response-opaque-redirect
An opaque-redirect filtered response is a filtered response whose type is "opaqueredirect", status is 0, status message is the empty byte sequence, header list is empty, body is null, and trailer is empty.
https://fetch.spec.whatwg.org/#http-fetch 表示如果重定向设置为 'manual':
,响应将变为不透明重定向Switch on request’s redirect mode:
...
- manual
Set response to an opaque-redirect filtered response whose internal response is actualResponse.
规范还说:
In other words, an opaque filtered response and an opaque-redirect filtered response are nearly indistinguishable from a network error.
鉴于所有这些,为什么在使用 Fetch API 时将一组重定向到手动?对我来说,这似乎毫无用处。是否存在有用的用例?
简短的回答是:除非你像 https://github.com/whatwg/fetch/issues/66 那样用 service-worker 代码做一些事情,否则你永远不需要 redirect: 'manual'
.
更长的答案:
HTML spec requires 浏览器在浏览器开始导航到资源时首先将重定向模式设置为 manual
。这是 manual
重定向模式在任何规范中的唯一用途。
但是因为 Fetch API 本质上暴露了浏览器内部用于提取的相同原语,所以它暴露了 manual
重定向模式。然而,仅仅因为 API 公开了一个特定的原语并不意味着该原语在前端代码中有很好的用途。
规范曾经要求即使您 可以 使用 redirect: 'manual'
调用 API,如果您这样做,浏览器也会抛出错误 — 因为那时没有人除了浏览器进行导航之外,还没有提供任何有效的理由来设置它。
但是由于 https://github.com/whatwg/fetch/issues/66,该行为发生了变化,这给出了一个(角落)案例,其中服务工作者代码中需要 redirect: 'manual'
。
您可以在 Fetch API 中设置但在 Web 应用程序代码中几乎没有用处的类似情况是 mode: 'no-cors'
。最初添加它只是因为浏览器将它用于某些请求,所以 Fetch API 公开了它。但这是另一种情况,它只对服务工作者具有有限的效用——用于缓存响应以便稍后按原样返回,而无需检查响应(mode: 'no-cors'
阻止网络应用程序代码执行此操作)。