通過擴展API不能立即支持更改HTTP方法。有幾種方法可以獲得理想的結果。在下面的答案中,我將只解釋如何爲sub_frame
和main_frame
類型的請求執行此操作,因爲這可能是您想要的(POST對於類型如image
或stylesheet
沒有任何意義)。
您可以修改請求程序,以便它通過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或¶m=value
)。閱讀文檔以獲取有關(動態生成)表單的更多信息:<form>
和HTMLFormElement
。
感謝您的解釋。真的有幫助,但是當用戶轉到頁面時我希望它改變請求。例如,我在一個新選項卡中輸入「www.google.com」,併發出GET請求,但我希望它成爲POST請求。那可能嗎? – 2014-12-01 21:32:47
@PabloMatíasGomez是的,那是可能的。我通過添加額外表單數據的示例更新了我的答案。 – 2014-12-01 21:38:08
太棒了!我可以做到這一點,但我有一個問題,它正在做一個無限循環,因爲表單的提交使onBeforeRequest執行新的請求,我怎麼能添加一個標誌,以便我可以避免當從我的表單? – 2014-12-04 17:47:29