我正在尝试更改用户发出的请求的请求方法(发出POST请求)但我收到此错误:
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
答案 0 :(得分:3)
扩展API不会立即支持更改HTTP方法。有几种方法可以获得所需的结果。在下面的答案中,我将仅解释如何对sub_frame
和main_frame
类型的请求执行此操作,因为这可能是您想要的(对于image
等类型的POST或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
。