Youtube API不支持OPTIONS请求方法是一个已知问题,因此任何尝试进行跨源预检的Web应用都会失败,即使(如Youtube API的情况)实际的CORS也是如此请求会成功。由于本周我们再次面对这个问题,我们提出了三个解决方法;但是,每个人都有自己的优点和缺点。
可能的解决方法#1:忘记预检,只做简单的跨源请求。
好处 - A)它有效。 B)这是执行大多数GET或POST请求时所需的所有规范。
缺点 - A)规范声明任何PATCH,PUT或DELETE请求,以及使用除表单数据,url编码或文本之外的内容类型的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通过代理可能是非常野兽)。
这篇文章有一个实际的问题(或几个,实际上)
欢迎任何和所有评论 - 如果这不是这个问题的最佳论坛,我会提前道歉(虽然我希望通过将它放在Stack Overflow上,它会对其他人有用面对同样的问题)
答案 0 :(得分:0)
Youtube上传API(uploads.gdata.youtube.com)不支持CORS。
您可以对问题here和here进行投票。关于它的论坛帖子也有几篇。 CORS is not working !
谷歌似乎仍在努力解决这个问题,虽然大约一年前开始研究它,所以很可能在修复问题之前不推荐使用API(因为我们已经有了V3)。
唯一的解决方法是使用代理(这不是很酷)。基本上将视频上传到您的服务器上,然后将其发送到youtube。