JQuery的getJSON()没有正确设置Accept头?

时间:2010-09-23 18:18:05

标签: jquery ajax json getjson

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

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

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

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

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

3 个答案:

答案 0 :(得分:13)

这不是错误。

由于您的通话是跨域的,因此您的浏览器不允许您拨打XHR电话(同源政策)。在内部,jQuery使用“<script>标记hack”来解决这个问题,以进行跨域调用(这是JSONP数据类型背后的基本思想)。由于使用标记进行调用,因此jQuery无法修改标题的accepts部分。

jQuery通过隐藏这些细节来发挥其魔力,但不幸的是,在这种情况下,您似乎受Law of Leaky Abstractions的约束。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

这是一个已在jquery网站上关闭的错误。

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

似乎还没有解决此问题。