我有一个返回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会显示完整内容。
答案 0 :(得分:1)
谢谢大家,伙计们,我发现了我的问题。在我从this post复制粘贴代码后,我决定对其进行优化 - 我将所有语句都放入if METHOD == OPTIONS
。这是错误。
标题Access-Control-Allow-Origin
不仅应归还OPTIONS
请求。
我的更新代码运行良好:
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的第二条评论,但它已被删除=)
答案 1 :(得分:0)
您正在尝试从其他域加载资源。由于您请求JSON的服务未配置为允许此服务,因此请求失败。
请参阅:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS
答案 2 :(得分:0)
当我们将类型赋予“json”时,响应应该是严格的json对象。请验证回复或在此处发布。
请参阅以下网址摘录:JQuery API
“json”:将响应评估为JSON并返回JavaScript对象。 JSON数据以严格的方式解析;任何格式错误的JSON都会被拒绝,并抛出一个解析错误。从jQuery 1.9开始,空响应也被拒绝;服务器应该返回null或{}的响应。 (有关正确的JSON格式的更多信息,请参阅json.org。)
“jsonp”:使用JSONP加载JSON块。添加额外的“?callback =?”到URL的末尾以指定回调。通过将查询字符串参数“_ = [TIMESTAMP]”附加到URL来禁用缓存,除非缓存选项设置为true。
答案 3 :(得分:-1)