问答中心分类: AJAX如何使用js或jQuery向ajax请求添加自定义HTTP头?
0
匿名用户 提问 3月 前

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

9 Answers
0
Prestaul 回答 3月 前

根据您的需要,有几种解决方案。。。
如果你想的话向单个请求添加自定义标头(或一组标头)然后只需添加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多次,只发送最后一组标头,只执行发送前最后一次回调。

Kostas 回复 3月 前

如果我定义一个新的beforeSend在执行$.ajax

Prestaul 回复 3月 前

只能定义一个beforeSend回调。如果你打电话$.ajaxSetup({ beforeSend: func... })两次之后,第二次回调将是唯一触发的回调。

Prestaul 回复 3月 前

更新了我的答案以添加有关ajaxSetup

user1940268 回复 3月 前

大家好,标题:{“x-my-custom-header”:“some value”}在IE 8中不起作用。它在firefox和chrome中运行良好。我必须使用IE 8发送自定义标题。你有什么办法让它发挥作用吗?Thx公司

Prestaul 回复 3月 前

@user1940268您是否正在尝试执行跨域(CORS)请求或其他类型的自定义标头?我当然在IE8中使用了所有这些技术,并且确信它们都是有效的。一个例外是xDomain请求,您需要IE8中的另一种技术。

user1940268 回复 3月 前

@普雷斯塔尔谢谢你的回复。我的ajax请求位于同一个域中$(文件)。就绪(function(){$.ajax({url:url,type:“POST”,headers:{‘x-my-custom-header’:’some value’}});});

Prestaul 回复 3月 前

@user1940268,我认为在发布的代码之外肯定还有其他事情发生(在尝试读取标题时可能是服务器端)。你的ajax调用看起来不错,我想我在这里帮不了你。

svassr 回复 3月 前

看起来它不适用于CORS请求(每个浏览器)。是否有变通方法?

svassr 回复 3月 前

在此处找到我的解决方案堆栈溢出。com/questions/8685678/…

Prestaul 回复 3月 前

@svassr CORS有不同的要求,正如您所发现的,除了一些(非常基本的)标题之外,任何其他的都必须通过Access-Control-Request-Headers标题。

Kevin Lee 回复 3月 前

对于我的情况,我想要http头accept价值严格公正text/plain。ajax的accepts我的行为真的把我绊倒了。在我的text/plain。叹气指定headers效果更好。

Si8 回复 3月 前

我发现这个错误:对飞行前请求的响应未通过访问控制检查

Prestaul 回复 3月 前

@Si8,这在我看来是一个跨域问题。您不能从一个域向另一个域发出请求。尝试查看CORS,看看这是否有帮助。

mrid 回复 3月 前

这些都不管用。我试过了,他们把我的请求改为options从…起postget

llange 回复 3月 前

请注意,在JS中,您将使用连字符设置标题,并且可以使用前缀为的下划线从PHP访问标题HTTP_例如:。$.ajaxSetup({headers:{'X-MY-CUSTOM-HEADER':'somevalue'});可以通过以下方式从PHP访问$_SERVER['HTTP_X_MY_CUSTOM_HEADER']

0
Szilard Muzsi 回答 3月 前

或者,如果要为将来的每个请求发送自定义标头,则可以使用以下命令:

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

这样,除非请求的选项显式覆盖,否则未来的每个ajax请求都将包含自定义头。您可以在上找到更多信息ajaxSetup 在这里

Trip 回复 3月 前

在我真正想实现这一点的地方,这似乎并没有真正起作用。

Szilard Muzsi 回复 3月 前

您应该确保在实际的ajax调用之前调用了ajaxSetup。我不知道这不起作用的其他原因:)

0
Roland T. 回答 3月 前

您也可以在不使用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;
0
Jayendra 回答 3月 前

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

$.ajax({
  url: url,
  beforeSend: function(xhr) {
    xhr.setRequestHeader("custom_header", "value");
  },
  success: function(data) {
  }
});
0
James 回答 3月 前

下面是一个使用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函数指定名称和值。

Dan Dascalescu 回复 3月 前

虽然这在2011年可能是正确的,但一般来说,最好不要重新发明轮子,而是使用像Zepto或jQuery这样的AJAX库。

roryhewitt 回复 3月 前

除非您试图向现有的XHR2调用中添加一个标头,并且不想开始重写它来使用jQuery来实现这一点。。。在这一点上,@格里兹利有了唯一可行的答案。

Cobertos 回复 3月 前

@AliGajani问题是某些应用程序或库(如THREE.js)不使用$.ajax*函数b/c它们不依赖于jQuery,而是使用XHR,因此在这些情况下,这是唯一有效的选项。

Oztaco 回复 3月 前

@AliGajani另外,这不仅仅是网络加载时间,也是库的解析时间。此外,如果您不小心添加了哪些依赖项,那么很快就会得到一个依赖项太多的项目