打开一个选项卡,并在firefox插件中向它发出POST请求

时间:2014-10-30 06:30:20

标签: firefox firefox-addon firefox-addon-sdk

在我的插件中,我必须以urlencoded POST提交数据,现在我使用js脚本来执行此操作(在当前页面中注入表单并提交它)但我想知道是否有解决方案来执行此操作Firefox Addon SDK?

我还没有在高级API中找到线索,但我对低级别不太熟悉,是否可以使用' window / utils' openDialog方法? 有一些args参数,但我不知道如何使用它。

感谢。

修改

具体来说,我需要在新标签中模仿html表单的行为。

3 个答案:

答案 0 :(得分:2)

查看以下两个主题:(1)Replication of Form method with loadOneTab和(2)Use Blob on firefox add-on

你可以做的一件有趣的事情是,XHR请求它并使用返回的源使它成为blob并在tab中加载加载blob:

var {Blob, File} = Cu.import("resource://gre/modules/Services.jsm", {});
var oFileBody = '<a id="a"><b id="b">hey!</b></a>'; // the body of the new file...
var oBlob = Blob([oFileBody], { type: "text/html"});
var blobUrl = URL.createObjectURL(oBlob); //returns a string like blob:null/bbe1b94e-0800-4af2-9d9e-df09c0b9cab3 so paste that into your url bar

或者只看@nmaier如何将数据发布到新标签页。

或者凌乱的方式,从源代码中创建一个数据网址,如`data:text / html, rawr &#39;并把它放在你的网址栏。我更喜欢@nmaiers方法

或者再看看@nmaier如何将数据发布到新标签页。 (我喜欢他的方式)

答案 1 :(得分:1)

只是为我的评论添加代码,我这样做了:

const querystring = require('sdk/querystring');
let stringStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);
stringStream.data = querystring.stringify(params); // params is a json data

let postData = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance(Ci.nsIMIMEInputStream);
postData.addHeader("Content-Type", "application/x-www-form-urlencoded");
postData.addContentLength = true;
postData.setData(stringStream);

var tabBrowser = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator).getMostRecentWindow("navigator:browser").gBrowser;
var selectedTabIndex = tabBrowser.tabContainer.selectedIndex;
var newTab = tabBrowser.loadOneTab("https://myurl.com/", {
    inBackground: false,
    postData: postData
});
tabBrowser.moveTabTo(newTab, selectedTabIndex + 1);

答案 2 :(得分:0)

使用可以使用Request发送您的数据。

var Request = require("sdk/request").Request;
var latestTweetRequest = Request({
  url: "https://api.twitter.com/1/statuses/user_timeline.json?screen_name=mozhacks&count=1",
  onComplete: function (response) {
    var tweet = response.json[0];
    console.log("User: " + tweet.user.screen_name);
    console.log("Tweet: " + tweet.text);
  }
});