2012-05-09 83 views
20

在xhr對象中使用getAllResponseHeaders,可以在ajax調用後獲取所有響應標頭。 但我找不到獲取請求標頭字符串的方法,這可能嗎?JS/jQuery獲取HTTPRequest請求標頭?

+0

爲什麼你需要知道客戶端上的請求頭是什麼? – Quentin

+2

用於調試目的 – Lwyrn

+0

爲什麼不在請求頭到達服務器時查看請求頭?或者使用Charles這樣的代理? – 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/

編輯:如果你想只捉對所有標題調用XMLHttpRequest上的setRequestHeader,然後你可以包裝該方法。這有點破解,當然你需要確保在任何請求發生之前運行下面的函數包裝代碼。

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

你看過w3c XMLHttpRequest規範嗎?http://www.w3.org/TR/2012/WD-XMLHttpRequest-20120117也許你可以包裝XMLHttpRequest對象,然後捕獲如果它們正在被設置,那麼這些標題有點不一樣 –

+1

是的,它似乎不可能趕上請求標題 – Lwyrn

1

您可以使用Sinon的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