PWA 应用遇到跨域导致 XHR 文件下载大小为 0 的问题该怎么办?

在开发 PWA 应用时,我们可能会遇到一种情况:当我们使用 XHR(XMLHttpRequest)对象请求跨域资源时,返回的文件大小为 0,这是因为浏览器出于安全考虑,阻止了跨域请求。那么,如何解决这个问题呢?

什么是 PWA?

PWA(Progressive Web App)是一种新型的 Web 应用程序模型,是 Web 应用程序和移动应用程序的完美结合。PWA 具有以下特点:

  • 可以脱离网络使用
  • 可以在桌面上启动
  • 可以像移动应用一样在主屏幕上添加图标
  • 可以像移动应用一样推送通知

PWA 应用遇到的跨域问题

当 PWA 应用请求跨域资源时,浏览器会阻止请求,这是为了保护用户的隐私和安全。但是,有时候我们确实需要请求跨域资源,比如请求第三方 API 或者 CDN 上的资源。这时候,我们就需要解决跨域问题了。

解决跨域问题的方法

  1. 使用 CORS(Cross-Origin Resource Sharing)协议

CORS 协议是一种跨域资源共享的协议,它允许跨域请求资源。我们可以在服务器端设置响应头,允许指定域名的请求。示例代码如下:

---------------------------- -------------------
----------------------------- ---- ----- ---- ------
----------------------------- ------------
  1. 使用 JSONP(JSON with Padding)

JSONP 是一种跨域请求的方式,它利用了 script 标签不受跨域限制的特点。我们可以在客户端动态创建 script 标签,指定请求的 URL,并在 URL 中添加一个回调函数名,服务端返回一个 JavaScript 函数调用,客户端接收到响应后,就可以执行这个回调函数了。示例代码如下:

-------- ---------- --------- -
  ----- ------ - --------------------------------
  ---------- - --- - ------------ - --------
  ---------------------------------
-

----------------------------------------- -----------------

-------- -------------------- -
  -----------------
-
  1. 使用代理服务器

如果以上两种方式都无法解决问题,我们可以使用代理服务器。代理服务器可以将客户端的请求转发到目标服务器,并将响应返回给客户端,这样就避免了跨域问题。示例代码如下:

----- ------- - ------------------
----- ------- - ------------------

----- --- - ---------

--------------- ----- ---- -- -
  ----- --- - ------------------------- - -------
  --------------------------------
--

---------------- -- -- -
  ------------------ ------ -- ------- -- -----------------------
--

XHR 文件下载大小为 0 的问题

以上三种方式都可以解决跨域问题,但是有时候我们在使用 XHR 请求跨域资源时,会遇到一个问题:文件大小为 0。这是因为浏览器会将跨域请求的响应设置为 opaque,导致 XHR 对象无法读取响应体。解决这个问题的方法是将 XHR 的 responseType 设置为 blob,然后将 blob 对象转换为 URL,最后使用 URL.createObjectURL() 方法创建一个对象 URL,就可以下载跨域资源了。示例代码如下:

-------- ----------------- -
  ----- --- - --- ----------------
  --------------- ---- -----
  ---------------- - ------
  ---------- - -- -- -
    -- ----------- --- ---- -
      ----- ---- - ------------
      ----- --- - -------------------------
      ----- ---- - ---------------------------
      --------- - ---
      ------------- - ----------
      ------------
      ------------------------
    -
  -
  ----------
-

--------------------------------------------

总结

PWA 应用遇到跨域导致 XHR 文件下载大小为 0 的问题,可以通过设置 CORS 响应头、使用 JSONP 或者代理服务器来解决跨域问题。如果遇到 XHR 文件下载大小为 0 的问题,可以将 XHR 的 responseType 设置为 blob,然后将 blob 对象转换为 URL,最后使用 URL.createObjectURL() 方法创建一个对象 URL,就可以下载跨域资源了。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66042db0d10417a22214a864