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

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

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

如您所见,这并不完全复杂,并且应该(我99%确信...)导致发送带有application/json的Accept header 的XHR。就像我说的,按照Firebug的Net控制台,这没有发生。如果有关系,则在Firefox 3.6.8中使用。

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

最佳答案

这不是错误。

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

jQuery通过向您隐藏这些细节来发挥其魔力,但是不幸的是,在这种情况下,您似乎必须遵守Law of Leaky Abstractions的规定。

关于jQuery getJSON()未正确设置Accept header ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3781343/

10-09 16:05
查看更多