不应该异步Javascript XMLHttpRequest默认设置XMLHttpRequest请求头吗?

时间:2016-12-08 12:09:05

标签: javascript jquery ajax asynchronous

我使用vanilla js向我的服务器发出了小的异步GET请求。

var rReq = new XMLHttpRequest();
      rReq.onload = function (e) {
          window.updateCartnRows(e.target.response);
      };
      rReq.open('GET', '/usr/cart/xhrRemoveItemsByType/' + type, true);     
      rReq.responseType = 'text';
      rReq.send();

从客户端的角度来看,它按预期工作,但我的服务器不会将其视为异步请求,它会失败xhr检查我是否设置它。

Equal Jquery请求正常工作:

 $.get('/usr/cart/xhrRemoveItemsByType/' + type, function (e) {
      console.log(e);
      window.updateCartnRows(e);
  });

X-Requested-With“XMLHttpRequest”http标头的区别,它在Jquery请求中默认设置。 我发现vanilla js查询可以用这一行修复:

rReq.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

但我对此解决方案存在疑问,例如文档(例如MDN)没有提到设置此标头的必要性,只是XMLHttpRequest.open()方法中async的真参数。

3 个答案:

答案 0 :(得分:1)

首先,您要混淆不相关的事情:请求是否异步,以及请求是否来自XMLHttpRequest对象,彼此无关。

XMLHttpRequest specification中没有任何内容表示必须设置该标头。从历史上看,有些实现设置了它,但这不是标准化的。

jQuery的源代码涉及显式设置该头(除了跨源请求),这就是你在通过jQuery的XHR包装器发出的请求中看到它的原因。

如果您希望请求包含标题,请在调用setRequestHeader之前使用您在问题中包含的代码将其添加到send

答案 1 :(得分:1)

XMLHttpRequest只是发送http请求的http客户端。 http协议中没有async/sync。它只是浏览器中的一个视图。

答案 2 :(得分:1)

设置标头是jQuery特定的事情,请参阅https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js#L59

您可以在What's the point of the X-Requested-With header?

详细了解这样做的原因

我认为如果你的后端需要它,你设置它的实现是直截了当的。