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

| 我得到状态码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;
    })
演示-> http://jsfiddle.net/QFuBr/ 提前致谢! 彼得     
已邀请:
服务器向浏览器显示403错误,因为您没有访问资源的权限,原因是报告了错误消息(\“所请求的用户的收藏夹不公开。\”)。 但是,在jsFiddle示例中服务器甚至没有收到请求。 您无权提出跨浏览器的AJAX请求。这称为同源策略。出于安全原因,可以防止恶意代码编写者在您不知情的情况下做不愉快的事情。这是一种钝器,但有效。 当您甚至无法发送请求到服务器时,都没有状态码。 XMLHTTPRequest对象(及其jqXHR包装器)将其报告为“ 1”。 基本上,您无法执行浏览器中要执行的操作。 如果您需要浏览器异步访问此类数据,则需要在服务器上编写包装器,以从远程服务器获取信息并将其提供给浏览器。有一种解决方法(称为JSONP –带有填充的JSON),但我不认为YouTube支持它。 编辑:根据gradbot的回答,可以通过更改代码以将
dataType
设置为
jsonp
来进行JSONP请求。 但是,您现在将无法使用
xhr.status
。这是因为JSONP不使用XHR对象,所以没有可检查的状态。 这是使用建议的feed机器人的一个工作示例。请注意,结果对象而不是jqXHR对象被传递给处理程序。     
您需要设置
dataType: \"jsonp\"
,并且需要以尝试从中获取收藏夹的用户身份登录。在这种情况下,我将使用自己的用户名抓取工具,并且警报将作为成功返回。 如果您尝试访问的帐户没有有效的Cookie,则api调用将返回内容为ѭ7的
403
$(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);
    })
});
    
403是因为您需要为正在访问其视频的用户提供凭据。假设提供了正确的凭据,由于跨域限制,请求仍将失败。 在大多数情况下,状态码“ 1”表示无法将请求发送到服务器。这是您的小提琴示例的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,但要使用它,您必须传递一个值为
json-in-script
alt
参数,并将
dataType
指定为
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
    }
});
    
由于大多数现代浏览器的安全性限制,您无法执行跨域请求(无论是GET还是POST)。 如果您仍然想从其他域中获取数据,请考虑使用安装在服务器上并通过其发送所有请求的反向代理。对于浏览器,它仍然看起来像数据来自同一域。 最受欢迎的方法之一是Apache中的mod_reverse,但还有其他选择,具体取决于您的服务器环境。 如果Google API支持,则另一种选择是使用用户JSONP。     

要回复问题请先登录注册