跨域ajax调用以获取JSON响应失败,JSON格式正确

时间:2014-02-13 18:03:32

标签: javascript json cross-domain

我想执行以下AJAX调用(跨域):

 $.ajax({
        type: 'GET',
        url: url + "?callback=?",
        contentType: 'application/json',
        async: false,
        jsonp: "callback",
        dataType: 'jsonp',           
        success: function (json) {
            alert("ok" + JSON.stringify(json));
        },
        error: function (json) {
            alert("err" + JSON.stringify(json));
        }
    });

我收到此警告信息:

  

ERR { “readyState的”:4 “状态”:200, “状态文本”: “成功”}

这意味着代码以错误方法结束。

如果我在Firefox或Chrome中检查请求,则响应的JSON部分可用且格式清晰。 是否可以在错误方法中获取JSON响应?或者您是否知道为什么没有成功方法?

不幸的是,这不是我的服务器,所以我无法在服务器端实现任何更改。我使用http://jsonlint.com/来验证JSON输出,它是有效的。在浏览器中输入相同的URL会正确返回JSON内容。

非常感谢, 我尝试了一些不同的方法,但仍然没有使用错误方法,

[编辑]

所以,我正在玩不同的方法,总是得到同样的错误。如果我将调用的错误部分更改为:

 error: function (jqXHR, textStatus, ex) {
            console.log(arguments);
            alert(textStatus + "," + ex + "," + jqXHR.responseText);
        }

然后我收到以下错误:

http://i.stack.imgur.com/ck6Sd.png

复制搜索引擎的错误粘贴:

  

0:对象   1:“parsererror”   2:错误   消息:“jQuery11020553141210693866_1392367304225未被调用”   堆栈:(...)   get stack:function(){[native code]}   set stack:function(){[native code]}    proto :d   callee:function(jqXHR,textStatus,ex){   长度:3    proto :对象

同样适用于上述情况,浏览器中的响应可以在没有问题的情况下读取。

EDIT2

我最后以旧方式进行JSON调用,将其嵌入到页面中:

script = document.createElement("script");
    script.type = "text/javascript";
    script.id = "resultJSON";
    script.src = url;

    $(".resultsOutput").append(script);

但我检索数据时遇到麻烦,脚本标签似乎是空的。我在JSON上收到错误:

Uncaught SyntaxError:意外的令牌:

任何人都可以提供帮助吗?我开始对这个绝望了。似乎问题是没有方法包装器返回JASON。

[最后编辑]

因此,事实证明服务器不支持CORS并且返回的JSON没有包含在JS函数中,因此这种方法不起作用。我将不得不使用其他方法来检索数据..感谢大家阅读

安迪

1 个答案:

答案 0 :(得分:1)

有什么特别的理由:

  • 覆盖随机回调名称jquery给出?
  • 将数据类型设置为application / json?

第二个可能导致错误。如果我是正确的,服务器将返回application / javascript mime-type,因为它应该返回您要查找的JSON包装到一个回调函数中,该函数将在请求完成后调用。像这样:

function callback() {
   return {"a","b"} //the JSON you are looking for
}

这一切都是通过创建标记“脚本”来内部处理的,以避免跨域浏览器限制,因此您无法直接处理JSON,需要将其包装到Javascript代码中。因此,contentType可能是错误的。

尝试删除ajax选项上的contenType属性,并查看jquery的行为(它应该解释来自服务器响应头的内容类型)。