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



我已经用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 检查。

相等的Jquery请求工作正常:

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

X-Request-With "XMLHttpRequest" http 标头的差异,这是在 Jquery request 中默认设置的。 我发现香草js查询可以用这一行修复:

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

但是我对这个解决方案持怀疑态度,因为在文档(例如 MDN)中没有提到设置此标头的必要性,只是 XMLHttpRequest.open() 方法中异步的 true 参数。

首先,您将不相关的事情混为一谈:请求是否异步,以及请求是否源自XMLHttpRequest对象,彼此无关。

XMLHttpRequest规范中没有任何内容说它必须设置该标头。从历史上看,一些实现已经设置了它,但这不是标准化的。

jQuery的源代码涉及显式设置该标头(跨源请求除外),这就是为什么您可以在通过jQuery的XHR包装器发出的请求中看到它的原因。

如果您希望请求具有标头,只需使用问题中包含的代码将其与setRequestHeader一起添加,然后再调用send

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

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

您可以在 X-Request-With 标头的意义何在?

我认为如果您的后端需要它,您设置它的实现是直接和正确的。

最新更新