小编典典

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

ajax

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

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中使用。

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


阅读 302

收藏
2020-07-26

共1个答案

小编典典

这不是错误。

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

jQuery通过向您隐藏这些细节来发挥其魔力,但是不幸的是,在这种情况下,您似乎受制于泄漏抽象定律

2020-07-26