【问题标题】:Fetch GitHub source tarball without CORS issues获取没有 CORS 问题的 GitHub 源代码压缩包
【发布时间】:2020-08-25 09:08:36
【问题描述】:

是否可以在没有 CORS 代理的情况下直接在浏览器中从公共 GitHub 存储库下载 tarball?

fetch('https://api.github.com/repos/vadimkantorov/torchwav/tarball/master')

/*Refused to connect to 'https://api.github.com/repos/vadimkantorov/torchwav/tarball/master' because it violates the following Content Security Policy directive: "connect-src mc.admetrica.ru wss://webasr.voicetech.yandex.net mc.yandex.ru yandex.ru".

(anonymous) @ VM24:1
VM24:1 Refused to connect to 'https://api.github.com/repos/vadimkantorov/torchwav/tarball/master' because it violates the document's Content Security Policy.
(anonymous) @ VM24:1
Promise {<rejected>: TypeError: Failed to fetch
    at <anonymous>:1:1}
VM24:1 Uncaught (in promise) TypeError: Failed to fetch
    at <anonymous>:1:1
*/

fetch('https://github.com/vadimkantorov/torchwav/archive/master.tar.gz')
/*VM52:1 Refused to connect to 'https://github.com/vadimkantorov/torchwav/archive/master.tar.gz' because it violates the following Content Security Policy directive: "connect-src mc.admetrica.ru wss://webasr.voicetech.yandex.net mc.yandex.ru yandex.ru".
(anonymous) @ VM52:1
VM52:1 Refused to connect to 'https://github.com/vadimkantorov/torchwav/archive/master.tar.gz' because it violates the document's Content Security Policy.*/

【问题讨论】:

  • 让“下载”链接访问您的节点服务器,该服务器获取 tarball,并将其发送回您的 UI。
  • 这是一个有效的解决方案,CORS 代理也是如此,但我想知道是否还有其他方法。也许,GitHub 特定的?例如。可以通过 GitHub API 单独请求所有文件,但这会很慢并且会占用 API 配额...

标签: javascript github cors


【解决方案1】:

无法在前端(即浏览器)中执行此操作,因为提供这些存档的服务不支持 CORS。无论如何,您真的不想一次又一次地为每个用户下载相同的存档,因为 (a) 这很慢并且用户体验不好,并且 (b) GitHub 可能会将其视为 DDoS 并暂停您的存储库。让每个用户都通过 API 请求每个文件同样有问题,甚至更慢。

您需要在后端提供某种缓存,方法是下载此存档一次并通过您的应用提供对所需文件的访问权限。这将更快,并导致使用的带宽更少。这也意味着,如果用户重新加载页面,他们将受益于您的应用为下载的文件提供的缓存,而不必再次重新加载相同的资源。

【讨论】:

    【解决方案2】:

    只需在网址前加上https://cors-anywhere.herokuapp.com/

    fetch('https://cors-anywhere.herokuapp.com/https://api.github.com/repos/vadimkantorov/torchwav/tarball/master')

    【讨论】:

    • 这就是我所说的 CORS 代理。我想让我的客户端应用程序尽可能私有,并避免让用户代码通过中间代理(特别是对于私有 repo tarball 案例)
    • 如果是公共存储库,没关系。如果是私人使用您自己的服务器。没有代理你不会这样做,因为浏览器是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多