2012-05-09 3 views
20

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

+0

Зачем вам нужно знать, какие заголовки запросов были на клиенте? – Quentin

+2

Это для цели отладки – Lwyrn

+0

Почему бы не посмотреть заголовки запроса, когда они достигли сервера? Или использовать прокси, как Чарльз? – Quentin

ответ

18

Если это предназначено для отладки, вы можете просто использовать 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/

EDIT: Если вы хотите просто поймать заголовки на всех вызывает 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' 
+0

Как я пишу в предыдущем комментарии: я пишу отладчик для своей платформы, чтобы помочь разработчикам разрабатывать дополнительные модули для него. Отладчик улавливает все запросы ajax и отображает всю информацию запроса (заголовок ответа, данные ответа, URL-адрес, состояние и т. Д.).Я просто хочу добавить заголовки запросов, чтобы иметь полное представление о запросе. Я знаю, что можно использовать интегрированные инструменты отладки браузера, я просто хочу дать настраиваемый инструмент. Поэтому заголовки запроса не могут быть уловлены :( – Lwyrn

+0

Вы просмотрели спецификацию XMLHttpRequest w3c http://www.w3.org/TR/2012/WD-XMLHttpRequest-20120117 Возможно, вы могли бы обернуть объект XMLHttpRequest, а затем захватить –

+1

Да, кажется, что невозможно поймать заголовки запроса – Lwyrn

1

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

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

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

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

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

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

+0

Официальная документация: http://sinonjs.org/docs/#server – uglymunky