2014-02-13 48 views
0

我想执行下列AJAX调用(跨域):跨域AJAX调用来获取JSON响应错误失败,JSON格式正确

$.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)); 
     } 
    }); 

而且我得到这个警报消息:

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

如果我在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: Object 1: "parsererror" 2: Error message: "jQuery11020553141210693866_1392367304225 was not called" stack: (...) get stack: function() { [native code] } set stack: function() { [native code] } proto: d callee: function (jqXHR, textStatus, ex) { length: 3 proto: Object

同样的东西适用于上面,响应在浏览器中是可读的,没有问题。

EDIT2

我最后做的JSON调用旧的方式,将其嵌入到页面:

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

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

但我有麻烦检索数据,脚本标签似乎是空的。

未捕获的SyntaxError:我的JSON得到一个错误的意外标记:

任何人能帮助我们吗?我开始对这个问题感到绝望。看来问题在于JASON没有使用方法封装来返回。

[最后编辑]

所以,原来的服务器不支持CORS和返回的JSON不裹在一个JS的功能,所以这种做法是行不通的。我将不得不使用其他方法来检索数据..感谢大家阅读

安迪

回答

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如何运行(它应该从服务器的响应头中解释内容类型)。

+0

看起来我倒过来了。服务器不会返回封装到函数中的响应,而是调用函数本身,并且jQuery将在响应到达时调用浏览器内存中的函数。看到这个线程:http://stackoverflow.com/questions/3506208/jquery-ajax-cross-domain?rq=1 –

+0

我试过你的第一个建议,删除contentType属性,但代码行为相同。对于你的其他问题,我只是尝试了不同的方法,现在,这是我得到的最远(否则由于我的问题的跨域部分,我得到了各种错误)。我会检查你建议的线索,并让你知道它是否有帮助。非常感谢你的时间,非常感谢。 – user3307231

+0

我检查了提到的链接,但是我找不到任何能帮助我的东西。自从尝试了其他方法后,我看到了更新后的问题。 – user3307231