【问题标题】:Youtube API (v3) and CORS preflightYoutube API (v3) 和 CORS 预检
【发布时间】:2013-05-20 14:51:46
【问题描述】:

编辑:看起来这篇文章没什么大不了的,因为 OPTIONS 预检是在去年秋天推出的;我的问题更多的是用户错误。有关更多详细信息,请参见 cmets(为了文档,我将全部保留在这里)。 --jlm


Youtube API 不支持 OPTIONS 请求方法是一个已知问题,因此任何尝试进行跨域预检的 Web 应用程序都会失败,即使(与 Youtube API 一样)实际的 CORS请求会成功。由于本周我们再次面临这个问题,我们提出了三种解决方法;但是,每个都有自己的优点和缺点。

可能的解决方法 #1:忘记预检,只需发出简单的跨域请求。

好处 -- A) 它有效。 B) 这是执行大多数 GET 或 POST 请求时所需的全部规范。

缺点 -- A) 规范声明任何 PATCH、PUT 或 DELETE 请求,以及使用除表单数据、url-encoded 或 text 之外的内容类型的 POST 请求/plain,需要预检。因此,虽然它会起作用,但它会违反规范(如果可能,我们希望避免这种情况)。 B) 设置自定义标头时也需要预检;因此,例如,当我在 1.0 分支中使用 AngularJS 的 $http 方法时,它会设置一个自定义标头,从而触发对 GET 请求的预检。在这种情况下,当然,我可以编写自己的 $http 服务或转移到 1.1 分支(因为问题实际上出在 Angluar 端)。

可能的解决方法 #2:使用 JSON-P

好处 -- A) 它也有效(在某些情况下,无论如何)。 B) 设置起来相当简单。

缺点 -- A) 一种较旧的技术,尚不清楚 Youtube API 是否会继续支持 JSONP。 B) 需要回调。 C) 仅限于 GET 请求。

可能的解决方法 #3:在同一域上设置服务器端代理,使用它与 Youtube API 进行通信。

好处 -- A) 完全不需要执行 CORS 请求,因为客户端在同一个源上工作,而服务器端代理不需要预检任何内容。

缺点 -- A) 设置起来可能会很复杂,尤其是在尝试使用凭据时(通过代理的 oAuth2 可能是相当厉害的)。

所以这篇文章有一个实际的问题(或几个,实际上)

  1. 您对上述任何或所有解决方法有何看法(无论好坏)?
  2. 有人实施过其他解决方案吗?
  3. 是否有任何关于 Youtube 服务器是否/何时可能支持 OPTIONS 方法的信息?

欢迎任何和所有的 cmets - 如果这不是解决此类问题的最佳论坛,我提前道歉(尽管我希望通过将它放在 Stack Overflow 上,它会证明对其他人有用面临同样的问题)

【问题讨论】:

  • 只是一个关于 Youtube API 的问题 - 它是否支持任何“非简单”CORS 请求(需要预检的请求)?因为我无法理解他们如何在不支持预检的情况下做到这一点。如果他们不支持它,我看不出你为什么需要在客户端“打破规范”(我也不明白如何你能做到)?
  • gdata.youtube.com 和 www.googleapis.com 服务器确实支持 OPTIONS 预检请求,并且预计 CORS 可以工作。一个例外是 uploads.gdata.youtube.com,因为我从来没有成功完成 v2 CORS 上传,这是工程团队正在努力的事情。您是否有未通过 OPTIONS 预检的 YouTube API 调用示例?
  • 我想在进一步调查后我会在这里回溯一些,因为我在客户端中发现我使用的“Access-Control-Request-Method”标头有问题。修复了一些请求(我很高兴看到 OPTIONS 工作——自从去年 8 月的一个帖子让我相信它仍然不受支持以来,我还没有签入!)但是,我仍然看到 OPTIONS当 Access-Control-Request-Headers 设置为“X-Requested-With”时,预检失败 - 这是预期的行为(我假设是)?
  • @JeffPosnick 工程团队还在 CORS (uploads.gdata.youtube.com) 上工作吗?我想他们开始已经快一年了。谷歌代码上的未解决问题很少(见code.google.com/p/gdata-issues/issues/detail?id=4050

标签: angularjs youtube-api cors


【解决方案1】:

Youtube 上传 API(uploads.gdata.youtube.com) 不支持 CORS。

您可以对herehere 的问题进行投票。也有一些关于它的论坛帖子。 CORS is not working !

Google 似乎仍在努力修复它,尽管大约一年前开始着手修复它,所以很可能该 API 会在修复该问题之前被弃用(因为我们已经有了 V3)。

唯一的解决方法是使用代理(这并不酷)。基本上将视频上传到您的服务器上,然后将其发送到 youtube。

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 2013-08-10
    • 2016-11-05
    • 2014-05-11
    • 1970-01-01
    • 2013-07-18
    相关资源
    最近更新 更多