跨浏览器获取响应验证

Cross browser fetch response validation

如何检查来自 JavaScript 提取的响应是否有效(状态 200),以跨浏览器工作的方式?

我找到的唯一解决方案是将响应作为 ArrayBuffer 读取并逐字节手动检查内容以查看它是否是有效文件。不太实用

在我的例子中,获取是在服务工作者中进行的,所以我不知道正在获取哪种资源(html 文档、图像、二进制文件等),我只想获取不同的操作取决于成功与否。

fetch('http://example.com/some_resource')
.then(function(response)
{
   if (response.ok)
   {
       // Works for most browsers, but not Chrome and Firefox on Android 
   }
   response.arrayBuffer().thenCheckEveryByteOfTheFile;  // Do I really have to do this?
});

更新: MDN 文档是错误的。 Response.ok 是为 Chrome 和 Android 上的 Firefox 定义的。

https://github.com/mdn/browser-compat-data/issues/9309

不幸的是,根据 MDNfetch() 对象的属性不(正式)完全兼容,尤其是在 Android 上 Chrome/Firefox/Opera 的移动端,因为今天的。

这不是您的选择,因为您正在使用 Service Worker,常规 Ajax 支持已被删除。 XHR 不会在那里定义,你只能使用 fetch() API.

否则,您可能会选择 XMLHttpRequest,它保留了完整的官方跨浏览器兼容性。

let xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com/some_resource');
xhr.send();

//When response is received
xhr.onload = function() {
  if (xhr.status == 200) { // xhr.status is compatible with Android
        console.log(xhr.response); 
        //OK!
  } else { 
        console.log(xhr.response); 
        //OOPS, not OK!
  }
};

无论如何,如果您尝试编写此脚本:

window.onload = function() {
    fetch('https://whateverfreeapiyoucanthink.of')
    .then(function(response)
    {
       alert(response.status);
    });
    }

然后从 Android 设备打开页面,这对我来说都适用 Chrome 88Firefox 86 使用 Android 8.0.0,虽然它不受官方支持。如果没有,这值得注意,因为它会证明 MDN 是错误的。