2014-12-01 86 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

相关问题