2014-12-01 54 views
1

Я пытаюсь изменить метод запроса (чтобы сделать запрос POST) запроса, сделанного пользователем, но я получаю эту ошибку:Ошибка: недопустимое значение для аргумента 4. Свойство «метод»: Неожиданное свойство

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

Изменение метода HTTP не поддерживается сразу через API расширений. Существует несколько способов получить желаемый результат. В ответе ниже я объясню, как это сделать для запросов типа sub_frame и main_frame, потому что это, вероятно, то, что вы хотели (POST для таких типов, как image или stylesheet, на самом деле не имеет смысла).

Вы можете либо изменить запросчика таким образом, чтобы он инициировал запрос POST вместо запроса GET через content script. Например. путем размещения <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, например. Это возможно? –

+0

@ PabloMatíasGomez Да, это возможно. Я обновил свой ответ на примере добавления дополнительных данных формы. –

+0

Отлично! Я мог бы это сделать, но у меня есть проблема, это делает бесконечный цикл, потому что представление формы делает onBeforeRequest выполненным для нового запроса, как я могу добавить флаг, чтобы я мог избежать, когда запрос сделан из моей формы ? –

Смежные вопросы