AJAX请求失败,原因不明(jQuery)
我有一个返回JSON数据的服务: http : //api.drag2droid.shamanland.com/captcha?base64
我正在尝试执行简单的AJAX请求:
$.ajax({ type: "get", url: "http://api.drag2droid.shamanland.com/captcha?base64", dataType: "json", success: function(data) { $("body").html(data); }, error: function(jqXHR, textStatus, errorThrown) { $("body").html("ajax failed: " + textStatus + ", " + jqXHR.status + " " + errorThrown); } });
结果是:
ajax failed: error, 0
但是如果我只是将这个url粘贴到浏览器的地址栏中,我就可以看到json的响应。
有人知道可能的陷阱吗?
JSFiddle: http : //jsfiddle.net/shomeser/n5TjL/
编辑:
实际上,我已经设置了我的服务器端以允许来自任何域的所有请求具有任何标头,PHP代码:
if ($_SERVER["REQUEST_METHOD"] == "OPTIONS") { header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Credentials: true"); header("Access-Control-Max-Age: 86400"); header("Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS"); if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"])) { header("Access-Control-Allow-Headers: {$_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"]}"); } exit(0); }
编辑:
在Firebug插件的Network-tab中,我可以看到没有检索到的内容:
但是,从浏览器直接获取GET-reqeust可以显示完整内容。
谢谢大家,伙计们,我发现了我的问题。 在我复制粘贴代码PHP 之后 ,我决定对其进行优化 – if METHOD == OPTIONS
我将所有语句都放入。 这是错误。
应该不仅为OPTIONS
请求返回Header Access-Control-Allow-Origin
。
我的更新代码工作正常:
if (isset($_SERVER["HTTP_ORIGIN"])) { header("Access-Control-Allow-Origin: {$_SERVER["HTTP_ORIGIN"]}"); } if ($_SERVER["REQUEST_METHOD"] == "OPTIONS") { if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_METHOD"])) { header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); } if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"])) { header("Access-Control-Allow-Headers: {$_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"]}"); } exit(0); }
感谢@Patrick Evans第二条评论,但它已被删除=)
您正在尝试从其他域加载资源。 由于您请求JSON的服务未配置为允许此服务,因此请求失败。
请参阅: https : //developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS
当我们将类型赋予“json”时,响应应该是严格的json对象。 请validation回复或在此处发布。
请参阅以下URL的摘录: JQuery API
“json”:将响应计算为JSON并返回JavaScript对象。 JSON数据以严格的方式解析; 任何格式错误的JSON都会被拒绝,并抛出一个解析错误。 从jQuery 1.9开始,空响应也被拒绝; 服务器应该返回null或{}的响应。 (有关正确的JSON格式的更多信息,请参阅json.org。)
“jsonp”:使用JSONP加载JSON块。 添加一个额外的“?callback =?” 到URL的末尾以指定回调。 通过将查询字符串参数“_ = [TIMESTAMP]”附加到URL来禁用缓存,除非缓存选项设置为true。
原因是因为CORS (即跨域问题)。 要克服使用jsonp而不是json。
dataType: "jsonp",