Изменение метода 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 или ¶m=value
). Прочтите документацию для получения дополнительной информации о (динамически сгенерированных) формах: <form>
и HTMLFormElement
.
Спасибо за объяснение. Действительно помогло, но я хочу, чтобы он изменил запрос, когда пользователь перешел на страницу. Например, я набираю 'www.google.com' на новой вкладке и делает запрос GET, но я хочу, чтобы это был запрос POST, например. Это возможно? –
@ PabloMatíasGomez Да, это возможно. Я обновил свой ответ на примере добавления дополнительных данных формы. –
Отлично! Я мог бы это сделать, но у меня есть проблема, это делает бесконечный цикл, потому что представление формы делает onBeforeRequest выполненным для нового запроса, как я могу добавить флаг, чтобы я мог избежать, когда запрос сделан из моей формы ? –