10

我得到状态码 0 ...但它是代码 403。有人能告诉我问题是什么吗?

查询

  var jqxhr = $.ajax({
        url: 'http://gdata.youtube.com/feeds/api/users/bernd/favorites?alt=json',
        dataType: 'json'
    }).success(function(xhr) {
        alert(xhr.status);
    }).error(function(xhr) {
        alert(xhr.status);
        return false;
    })

演示-> http://jsfiddle.net/QFuBr/

提前致谢!
彼得

4

4 回答 4

19

服务器向浏览器发出 403 错误,因为您没有访问资源的权限,因为报告了错误消息(“所请求用户的收藏夹不公开。”)。

但是,在 jsFiddle 示例中,服务器甚至没有收到请求。

不允许您发出跨浏览器的 AJAX 请求。这称为同源策略。出于安全原因,防止恶意编码人员在您不知情的情况下做出不愉快的事情。这是一种生硬的工具,但却是一种有效的工具。

当您甚至没有向服务器发送请求时,就没有状态代码。这由 XMLHTTPRequest 对象(及其 jqXHR 包装器)报告为0.

基本上,你不能在浏览器中做你想做的事情。

如果您需要浏览器异步访问这样的数据,您需要在服务器上编写一个包装器以从远程服务器获取信息并将其提供给浏览器。有一种解决方法(称为 JSONP – JSON with Padding),但我不相信 YouTube 支持它。


编辑:根据gradbot 的回答,可以通过将代码更改为设置dataType来执行 JSONP 请求jsonp

但是,您现在将无法使用xhr.status. 这是因为 JSONP 不使用 XHR 对象,因此没有可检查的状态。

这是一个使用 gradbot 建议的提要的工作示例。请注意,结果对象被传递给处理程序,而不是 jqXHR 对象。

于 2011-04-16T20:21:49.373 回答
2

您需要设置dataType: "jsonp"并且需要以您尝试从中获取收藏夹的用户身份登录。在这种情况下,我使用自己的用户名grabot,并且警报成功返回。

如果您尝试访问的帐户没有有效的 cookie,则 api 调用将返回403带有内容的"Favorites of requested user are not public."

$(function() {
    var jqxhr = $.ajax({
        url: 'http://gdata.youtube.com/feeds/api/users/gradbot/favorites?alt=json',
        dataType: 'jsonp'
    }).success(function(data, status) {
        alert(status);
    }).error(function(xhr) {
        alert(xhr.status);
    })
});
于 2011-04-16T20:28:46.430 回答
1

403 是因为您需要为正在访问其视频的用户提供凭据。假设提供了正确的凭据,由于跨域限制,请求仍然会失败。

在大多数情况下,状态码0意味着无法将请求发送到服务器。这是您的小提琴示例的 Chrome 控制台日志显示的内容。

XMLHttpRequest 无法加载http://gdata.youtube.com/feeds/api/users/bernd/favorites?alt=json。Access-Control-Allow-Origin 不允许来源http://fiddle.jshell.net 。

Youtube,实际上所有 Google Data API 都支持JSONP,但要使用它,您必须传递一个alt带有值的参数json-in-script并指定dataTypeas jsonp。jQuery 将为您提供回调参数。根据经验测试,Youtube 似乎并不关心alt具体的参数json-in-script。只要callback指定了参数,alt参数就可以只取值json

http://gdata.youtube.com/feeds/api/users/gradbot/favorites?alt=json http://gdata.youtube.com/feeds/api/users/gradbot/favorites?alt=json&callback=foo

这是一个可公开访问的提要的工作示例

$.ajax({
    url: 'http://gdata.youtube.com/feeds/mobile/videos?alt=json-in-script',
    dataType: 'jsonp',
    success: function(data) {
        // do something with data
    }
});
于 2011-04-16T21:00:43.920 回答
0

由于大多数现代浏览器的安全限制,您不能进行跨域请求(无论是 GET 还是 POST)。

如果您仍想从其他域获取数据,请考虑使用您在服务器上安装的反向代理并发送所有请求。对于浏览器,它看起来仍然像数据来自同一个域。

最受欢迎的方法之一是 Apache 中的 mod_reverse,但还有其他选择,具体取决于您的服务器环境。

如果 Google API 支持,另一种选择是用户 JSONP。

于 2011-04-16T20:29:44.887 回答