jqXHR – http-status-code-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错误,因为您没有权限访问该资源,因为报告了错误消息(“请求用户的collections夹不公开”。)。
但是,服务器甚至没有在jsFiddle示例中获取请求。
您不能进行跨浏览器的AJAX请求。 这称为同源政策 。 出于安全原因,防止恶意程序员在您不知情的情况下做出不愉快的事情。 这是一个生硬的工具,但却是一个有效的工具。
如果您甚至没有向服务器发送请求,则没有状态代码。 这由XMLHTTPRequest对象(及其jqXHR包装器)报告为0
。
基本上,你不能在浏览器中做你想做的事情。
如果您需要浏览器以异步方式访问此类数据,则需要在服务器上编写一个包装器以从远程服务器获取信息并将其提供给浏览器。 有一种解决方法(它称为JSONP – 带填充的JSON), 但我不相信YouTube支持它。
编辑:根据gradbot的回答 ,可以通过更改代码将dataType
设置为jsonp
来执行JSONP请求。
但是,您现在无法使用xhr.status
。 这是因为JSONP不使用XHR对象,因此没有可用于检查的状态。
这是一个使用feed gradbot建议的工作示例 。 请注意,结果对象将传递给处理程序,而不是jqXHR对象。
您需要设置dataType: "jsonp"
,您需要以尝试获取collections夹的用户身份登录。 在这种情况下,我使用自己的用户名抓取,警报返回成功。
如果您尝试访问的帐户没有有效的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); }) });
403是因为您需要为正在访问其video的用户提供凭据。 假设提供了正确的凭据,由于跨域限制,请求仍将失败。
在大多数情况下,状态代码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,但要使用它,你必须传递一个带有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
以下是可公开访问的Feed的工作示例 。
$.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。