如何使用 js 或 jQuery 向 ajax 请求添加自定义 HTTP 标头?

IT技术 javascript jquery ajax http-headers httprequest
2021-01-11 18:35:53

有谁知道如何使用 JavaScript 或 jQuery 添加或创建自定义 HTTP 标头?

6个回答

根据您的需要,有多种解决方案...

如果要将自定义标头(或标头集)添加到单个请求,则只需添加headers属性:

// Request with custom header
$.ajax({
    url: 'foo/bar',
    headers: { 'x-my-custom-header': 'some value' }
});

如果您想为每个请求添加默认标头(或标头集),请使用$.ajaxSetup()

$.ajaxSetup({
    headers: { 'x-my-custom-header': 'some value' }
});

// Sends your custom header
$.ajax({ url: 'foo/bar' });

// Overwrites the default header with a new header
$.ajax({ url: 'foo/bar', headers: { 'x-some-other-header': 'some value' } });

如果您想为每个请求添加一个标头(或一组标头),请 使用beforeSend带有$.ajaxSetup()以下内容钩子

$.ajaxSetup({
    beforeSend: function(xhr) {
        xhr.setRequestHeader('x-my-custom-header', 'some value');
    }
});

// Sends your custom header
$.ajax({ url: 'foo/bar' });

// Sends both custom headers
$.ajax({ url: 'foo/bar', headers: { 'x-some-other-header': 'some value' } });

编辑(更多信息):需要注意的一件事是,ajaxSetup您只能定义一组默认标头,并且只能定义一个beforeSend. 如果您ajaxSetup多次调用,则只会发送最后一组标头,并且只会执行最后一个发送前回调。

@Si8,对我来说这看起来像是一个跨域问题。您不能从一个域向另一个域发出请求。尝试查看 CORS,看看是否有帮助。
2021-03-19 18:35:53
更新了我的答案以添加有关ajaxSetup.
2021-03-24 18:35:53
您只能定义一个beforeSend回调。如果您调用$.ajaxSetup({ beforeSend: func... })两次,则第二个回调将是唯一触发的回调。
2021-03-31 18:35:53
如果beforeSend在执行 a 时定义 new 会发生什么$.ajax
2021-04-08 18:35:53
看起来它不适用于 CORS 请求(每个浏览器)。有解决办法吗?
2021-04-08 18:35:53

或者,如果您想为以后的每个请求发送自定义标头,则可以使用以下内容:

$.ajaxSetup({
    headers: { "CustomHeader": "myValue" }
});

这样,每个未来的 ajax 请求都将包含自定义标头,除非被请求的选项明确覆盖。你可以在这里找到更多信息ajaxSetup

在我真正想要实现这一目标的地方,这似乎并不实际。
2021-03-12 18:35:53
那么您应该确保在实际的 ajax 调用之前调用 ajaxSetup。我不知道为什么这不起作用的任何其他原因:)
2021-03-31 18:35:53

您也可以在不使用 jQuery 的情况下执行此操作。覆盖 XMLHttpRequest 的 send 方法并在那里添加标头:

XMLHttpRequest.prototype.realSend = XMLHttpRequest.prototype.send;
var newSend = function(vData) {
    this.setRequestHeader('x-my-custom-header', 'some value');
    this.realSend(vData);
};
XMLHttpRequest.prototype.send = newSend;

假设 JQuery ajax,您可以添加自定义标头,例如 -

$.ajax({
  url: url,
  beforeSend: function(xhr) {
    xhr.setRequestHeader("custom_header", "value");
  },
  success: function(data) {
  }
});

这是使用 XHR2 的示例:

function xhrToSend(){
    // Attempt to creat the XHR2 object
    var xhr;
    try{
        xhr = new XMLHttpRequest();
    }catch (e){
        try{
            xhr = new XDomainRequest();
        } catch (e){
            try{
                xhr = new ActiveXObject('Msxml2.XMLHTTP');
            }catch (e){
                try{
                    xhr = new ActiveXObject('Microsoft.XMLHTTP');
                }catch (e){
                    statusField('\nYour browser is not' + 
                        ' compatible with XHR2');                           
                }
            }
        }
    }
    xhr.open('POST', 'startStopResume.aspx', true);
    xhr.setRequestHeader("chunk", numberOfBLObsSent + 1);
    xhr.onreadystatechange = function (e) {
        if (xhr.readyState == 4 && xhr.status == 200) {
            receivedChunks++;
        }
    };
    xhr.send(chunk);
    numberOfBLObsSent++;
}; 

希望有帮助。

如果创建对象,则可以在发送请求之前使用 setRequestHeader 函数分配名称和值。

@AliGajani 问题是某些应用程序或库(如 THREE.js)不使用$.ajax*b/c 函数,它们不依赖于 jQuery,而是使用 XHR,因此在这些情况下这是唯一有效的选项。
2021-03-14 18:35:53
虽然这在 2011 年可能是正确的,但通常最好不要重新发明轮子,而是使用像 Zepto 或 jQuery 这样的 AJAX 库。
2021-03-28 18:35:53
除非您尝试向现有 XHR2 调用添加标头,并且不想开始重写所有标头以仅为此使用 jQuery ......此时,@gryzzly 有唯一可行的答案。
2021-03-28 18:35:53
@AliGajani 此外,这不仅仅是网络加载时间,还有库的解析时间。另外,如果不小心添加了哪些依赖项,很快就会得到一个依赖项太多的项目
2021-04-04 18:35:53