Подтвердить что ты не робот

JS/jQuery получить заголовки запросов HTTPRequest?

Используя getAllResponseHeaders в объекте xhr, можно получить все заголовки ответов после вызова ajax. Но я не могу найти способ получить строку заголовков запроса, возможно ли это?

4b9b3361

Ответ 1

Если это для целей отладки, вы можете просто использовать Firebug или инструменты разработчика Chrome (и независимо от того, что функция вызывается в IE), чтобы проверить сетевой трафик из вашего браузера на сервер.

Альтернативой было бы использовать что-то вроде этого script:

$.ajax({
    url: 'someurl',
    headers:{'foo':'bar'},
    complete: function() {
        alert(this.headers.foo);
    }
});

Однако я думаю, что доступны только заголовки, уже определенные в headers (не уверен, что произойдет, если заголовки изменены (например, перед отправкой).

Вы можете прочитать немного больше о jQuery ajax: http://api.jquery.com/jQuery.ajax/

РЕДАКТИРОВАТЬ: Если вы хотите просто поймать заголовки во всех вызовах setRequestHeader на XMLHttpRequest, вы можете просто обернуть этот метод. Это немного взломать, и, конечно же, вам нужно будет убедиться, что приведенный ниже код обертки функций запускается до того, как произойдет какое-либо из запросов.

// 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'

Ответ 2

Что-то, что вы могли бы использовать Sinon FakeXMLHttpRequest, чтобы заменить ваш браузер XHR. Он описал в этот документ о том, как использовать его для тестирования, но я уверен, что вы можете использовать модуль для своих целей отладки.

Что вам нужно сделать:

var requests;
this.xhr = sinon.useFakeXMLHttpRequest();
this.xhr.onCreate = function(xhr) {
    requests.push(xhr);
}

И затем позже вы можете проверить свой массив requests для заголовков на:

console.log(requests[0].requestHeaders);

Чтобы получить доступ к заголовкам ваших запросов.