2014-12-01 81 views
1

我試圖更改用戶發出的請求的請求方法(發出POST請求),但出現此錯誤:錯誤:參數4的值無效。屬性'method':意外的屬性

Error in event handler for webRequest.onBeforeSendHeaders/1: Error: Invalid value for argument 4. Property 'method': Unexpected property.

我的代碼是這樣的:

chrome.webRequest.onBeforeSendHeaders.addListener(function(data) { 
    console.log(data); 
    return {method: "POST"}; 
}, { 
    urls: ["<all_urls>"] 
}, ["blocking", "requestHeaders"]); 

我缺少的東西?我搜索了很多,但我找不到任何東西來改變請求方法webRequest

回答

3

通過擴展API不能立即支持更改HTTP方法。有幾種方法可以獲得理想的結果。在下面的答案中,我將只解釋如何爲sub_framemain_frame類型的請求執行此操作,因爲這可能是您想要的(POST對於類型如imagestylesheet沒有任何意義)。

您可以修改請求程序,以便它通過content script啓動POST請求,而不是GET請求。例如。通過找到<form>並將action設置爲"POST"

一個通用的方法是攔截請求並重定向到您的擴展頁面,然後將表單提交到所需的目標。 不要忘了添加頁面到web_accessible_resources。您可以通過URL(查詢字符串或參考片段)將參數傳遞到框架,或將參數存儲在背景頁面的字典中,並使用extension messaging API進行通信。
示例(使用查詢字符串傳遞URL):

chrome.webRequest.onBeforeRequest.addListener(function(details) { 
    var url = chrome.runtime.getURL('redirector.html') + 
      '?' + encodeURIComponent(details.url) 
    return { 
     redirectUrl: url 
    }; 
}, { 
    types: ['main_frame', 'sub_frame'], 
    urls: ['*://example.com/*'] 
}, ['blocking']); 

redirector.html(收藏此頁到web_accessible_resources!):

<form method="POST" id="form"></form> 
<script src="redirector.js"></script> 

redirector.js可能包含(注:參數驗證左作爲練習讀者):

var form = document.forms['form']; 

// URL is passed via the parameters 
// "chrome-extension://[extensionid]/redirector.html?http%3A%2F%2Fexample.com%2F 
//            ^
//             becomes http://example.com 
form.action = decodeURIComponent(location.search.slice(1)); 

// Example: Append extra form data 
var input = document.createElement('input'); 
input.type = 'text'; // Default 
input.value = 'extra data'; 
form.appendChild(input); 

form.submit(); 

這是一個非常簡單的例子。如果您想要將更多數據傳遞到頁面,請選擇適當的參數序列(例如JSON或&param=value)。閱讀文檔以獲取有關(動態生成)表單的更多信息:<form>HTMLFormElement

+0

感謝您的解釋。真的有幫助,但是當用戶轉到頁面時我希望它改變請求。例如,我在一個新選項卡中輸入「www.google.com」,併發出GET請求,但我希望它成爲POST請求。那可能嗎? – 2014-12-01 21:32:47

+0

@PabloMatíasGomez是的,那是可能的。我通過添加額外表單數據的示例更新了我的答案。 – 2014-12-01 21:38:08

+0

太棒了!我可以做到這一點,但我有一個問題,它正在做一個無限循環,因爲表單的提交使onBeforeRequest執行新的請求,我怎麼能添加一個標誌,以便我可以避免當從我的表單? – 2014-12-04 17:47:29

相關問題