AJAX请求失败,原因不明(jQuery)

时间:2014-01-31 05:29:54

标签: javascript jquery ajax json

我有一个返回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中,我可以看到没有检索到的内容: enter image description here

但是,从浏览器直接获取GET-reqeust会显示完整内容。

4 个答案:

答案 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)

原因是CORS(即跨域问题)。要克服使用jsonp而不是json。

dataType: "jsonp",