【发布时间】: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 可能是相当厉害的)。
所以这篇文章有一个实际的问题(或几个,实际上)
- 您对上述任何或所有解决方法有何看法(无论好坏)?
- 有人实施过其他解决方案吗?
- 是否有任何关于 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