2010-09-23 66 views
10

它看起来像过去人们在接受标题时遇到问题,但我不确定我的问题是否相关。使用jQuery 1.4.2,我无法通过getJSON()获得JSON。我可以在Firebug中看到请求/响应,看起来问题的根源在于,有问题的资源根据Accept头返回不同的结果。即使文档说它应该设置,在Firebug它显示为“/” - 显然,我想要“application/json”。这是一个已知的错误?我应该设置一些我不知道的标志吗?JQuery的getJSON()没有正确设置Accept头?

ETA:请求是跨站点的,如果有问题,但我传递callback=?查询参数,以便JQuery(成功)将其视为JSONP。我在这个特定情况下调用的服务支持接受覆盖查询参数(&accept=application/json),所以我得到它手动工作,但我仍然认为标题搞砸是奇怪的,希望我能够解决它,所以在处理可能不那么宽容的不同服务时,我不会再遇到这种情况。我没有一个简单的方法来复制/代码从我的开发环境,粘贴但这里的要点是:

$.getJSON(baseURL + "?item=" + itemNum + "&callback=?", function(data){ 
    console.log(data); 
} 

正如你所看到的,这是不完全复杂,应该(我99 %肯定...)导致一个XHR与一个Accept头部application/json一起发送。就像我说的那样,根据Firebug的Net控制台,这并没有发生。如果它很重要,这是在Firefox 3.6.8。

ETA Again:对于任何人仍然阅读这个,是的,它仍然在发生,不,我不知道为什么。就像我说的那样,简单的getJSON()调用,真正基本的语法,跨站点,被视为JSONP,因为它包含回调查询参数。仍然接受建议!

+1

向我们显示您的代码,我们可能会帮助您更多。 – Steven 2010-09-23 18:22:24

+0

我在Chrome 8中遇到了完全相同的问题。$ .getJSON(“url”,function(data){})设置Accept标头为*/* – 2010-10-16 04:28:46

回答

13

这不是一个错误。

由于您的通话是跨域的,因此您的浏览器不允许您进行XHR呼叫(同源策略)。在内部,jQuery正在使用“<script>标记破解”来解决此问题,以进行跨域调用(这是JSONP数据类型背后的有趣想法)。由于调用是使用标记完成的,因此jQuery不可能修改标头的accepts部分。

jQuery通过隐藏这些细节来发挥它的魔力,但不幸的是,在这种情况下,您似乎需要遵循Law of Leaky Abstractions

+0

非常有见地的答案 – 2015-04-07 13:40:25

2

没有看到您的代码(这可能指向我们明显的解决方案),您可以尝试使用标准的Ajax函数,看看你是否得到不同的结果?

$.ajax({ 
    url: '/what.eva', 
    dataType: 'json', 
    data: '{}', 
    success: callbackFunc 
}); 

function callbackFunc(result) { 
    alert(result); 
} 
+0

我试过了你的建议,取代了我的getJSON调用现在在主要问题中列出的细节)用$ .ajax调用,结果完全相同。我认为这必须是一个已知的错误,或者也许只是说我的浏览器很奇怪,但这肯定与预期的行为背道而驰。 – Coderer 2010-09-24 18:39:23

2

这是一个已经在jquery网站上关闭的bug。

http://dev.jquery.it/ticket/6551

似乎没有成为该修复呢。

+0

哇,所以别人有这个问题,但他们不能重现,所以他们关闭它?我会看看我是否可以对此作出贡献... – Coderer 2010-10-26 23:12:31

+0

如果您好奇:票已解决,皮特的答案是正确的 - 即使*看起来像*“正常”的AJAX请求(XHR),它实现了一个动态的'