Код в ответе cvsguimaraes работает для коротких строк данных, которые могут вписаться в URL.
Как свидетельствует этот вопрос , это не всегда так.
Ответ Кенни Эвитта намекает на решение. Я сделал реализацию этого вопроса и нашел время, чтобы обобщить его. Я представляю это здесь.
Идея состоит в том, чтобы открыть страницу, связанную с расширением (post.html), предоставить ей необходимую информацию посредством обмена сообщениями и выполнить POST с этой страницы.
post.html
<html>
<head>
<title>Redirecting...</title>
</head>
<body>
<h1>Redirecting...</h1>
<!-- Decorate as you wish, this is a page that redirects to a final one -->
<script src="post.js"></script>
</body>
</html>
post.js
var onMessageHandler = function(message){
// Ensure it is run only once, as we will try to message twice
chrome.runtime.onMessage.removeListener(onMessageHandler);
// code from https://stackoverflow.com/a/7404033/934239
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", message.url);
for(var key in message.data) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", key);
hiddenField.setAttribute("value", message.data[key]);
form.appendChild(hiddenField);
}
document.body.appendChild(form);
form.submit();
}
chrome.runtime.onMessage.addListener(onMessageHandler);
background.js (или другой сценарий без содержимого внутри расширения)
function postData(url, data) {
chrome.tabs.create(
{ url: chrome.runtime.getURL("post.html") },
function(tab) {
var handler = function(tabId, changeInfo) {
if(tabId === tab.id && changeInfo.status === "complete"){
chrome.tabs.onUpdated.removeListener(handler);
chrome.tabs.sendMessage(tabId, {url: url, data: data});
}
}
// in case we're faster than page load (usually):
chrome.tabs.onUpdated.addListener(handler);
// just in case we're too late with the listener:
chrome.tabs.sendMessage(tab.id, {url: url, data: data});
}
);
}
// Usage:
postData("http://httpbin.org/post", {"hello": "world", "lorem": "ipsum"});
Обратите внимание на двойной обмен сообщениями: с помощью обратного вызова chrome.tabs.create
мы не можем быть уверены, что слушатель готов, и мы не можем быть уверены, что загрузка еще не завершена (хотя в моем тестировании она все еще загружается). Но лучше, чем потом сожалеть.