jqXHR - http-status-code-403(但状态码为0)

时间:2011-04-14 10:23:49

标签: javascript jquery xmlhttprequest http-status-code-403

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

JQUERY

  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;
    })

DEMO - > http://jsfiddle.net/QFuBr/

提前致谢!
彼得

4 个答案:

答案 0 :(得分:19)

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

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

您不能进行跨浏览器的AJAX请求。这称为same-origin policy。出于安全原因,防止恶意程序员在您不知情的情况下做出不愉快的事情。这是一个生硬的工具,但却是一个有效的工具。

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

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

如果您需要浏览器以异步方式访问此类数据,则需要在服务器上编写一个包装器以从远程服务器获取信息并将其提供给浏览器。有一种解决方法(它叫做JSONP - 带填充的JSON)但我不相信YouTube支持它。


修改:按gradbot's answer,可以通过更改代码将dataType设置为jsonp来执行JSONP请求。

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

Here's a working example using the feed gradbot suggested。请注意,结果对象将传递给处理程序,而不是jqXHR对象。

答案 1 :(得分:2)

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

如果您尝试访问的帐户没有有效的Cookie,则api调用将返回内容为403的{​​{1}}

"Favorites of requested user are not public."

答案 2 :(得分: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,事实上all Google Data API's支持JSONP但要使用它,您必须传递值为alt的{​​{1}}参数,并指定json-in-script } dataType。 jQuery将为您提供回调参数。根据经验测试,Youtube似乎并不关心jsonp参数是否具体alt。只要指定了json-in-script参数,callback参数就可以只使用值alt

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

以下是可公开访问Feed的working example

json

答案 3 :(得分:0)

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

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

其中一个最受欢迎的是Apache中的mod_reverse,但根据您的服务器环境,还有其他选择。

如果Google API支持,则另一种方法是使用JSONP。