在 xhr 对象中使用 getAllResponseHeaders 可以在 ajax 调用后获取所有响应标头。但是我找不到获取请求标头字符串的方法,这可能吗?
问问题
52855 次
2 回答
26
如果这是出于调试目的,那么您可以只使用 Firebug 或 Chrome 开发人员工具(以及 IE 中调用的任何功能)来检查从浏览器到服务器的网络流量。
另一种方法是使用类似这个脚本的东西:
$.ajax({
url: 'someurl',
headers:{'foo':'bar'},
complete: function() {
alert(this.headers.foo);
}
});
但是我认为只有已经定义的标头headers
可用(不确定如果标头被更改会发生什么(例如在 beforeSend 中)。
你可以阅读更多关于 jQuery ajax 的信息: http: //api.jquery.com/jQuery.ajax/
编辑:如果您只想捕获 XMLHttpRequest 上对 setRequestHeader 的所有调用的标头,那么您可以包装该方法。这有点像 hack,当然您需要确保在任何请求发生之前运行下面的函数包装代码。
// Reasign the existing setRequestHeader function to
// something else on the XMLHtttpRequest class
XMLHttpRequest.prototype.wrappedSetRequestHeader =
XMLHttpRequest.prototype.setRequestHeader;
// Override the existing setRequestHeader function so that it stores the headers
XMLHttpRequest.prototype.setRequestHeader = function(header, value) {
// Call the wrappedSetRequestHeader function first
// so we get exceptions if we are in an erronous state etc.
this.wrappedSetRequestHeader(header, value);
// Create a headers map if it does not exist
if(!this.headers) {
this.headers = {};
}
// Create a list for the header that if it does not exist
if(!this.headers[header]) {
this.headers[header] = [];
}
// Add the value to the header
this.headers[header].push(value);
}
现在,一旦在XMLHttpRequest
实例上设置了标题,我们就可以通过检查xhr.headers
例如
var xhr = new XMLHttpRequest();
xhr.open('get', 'demo.cgi');
xhr.setRequestHeader('foo','bar');
alert(xhr.headers['foo'][0]); // gives an alert with 'bar'
于 2012-05-09T13:29:06.980 回答
2
您可以使用 Sinon 的 FakeXMLHttpRequest 替换浏览器的 XHR。本文档中描述了如何使用它进行测试,但我很确定您可以使用该模块进行调试。
你需要做的是:
var requests;
this.xhr = sinon.useFakeXMLHttpRequest();
this.xhr.onCreate = function(xhr) {
requests.push(xhr);
}
然后稍后,您可以通过以下方式检查requests
数组的标题:
console.log(requests[0].requestHeaders);
访问您的请求标头。
于 2013-01-15T22:35:38.417 回答