2014-10-30 60 views
1

在我的插件中,我必須提交數據爲urlencoded POST,現在我使用了一個js腳本來做到這一點(在當前頁面中注入一個表單並提交它),但我想知道是否有一種解決方案可以通過Firefox Addon SDK來實現?打開一個標籤,並在Firefox插件中發出POST請求

我還沒有在高級API中找到線索,但我對低級別不太熟悉,是否可以使用'window/utils'openDialog方法? 有一些參數參數,但我不知道如何使用它。

謝謝。

編輯

要具體,我需要模仿在新標籤中的HTML表單的行爲。

+0

很多在計算器上的話題在這個問題上,在過去幾個月copule。搜索'FormData',他們也在做一些開放的新標籤頁,並以一些有趣的方式發佈數據。你也可以用XHR來做。這些都是firefox-addon標籤中的主題,也是非常棒的主題。 – Noitidart 2014-10-30 15:05:08

+0

@Noitidart謝謝,我會研究這一點。 – 2014-10-30 15:54:10

回答

2

看看這兩項議題:(1)Replication of Form method with loadOneTab和(2)Use Blob on firefox add-on

你可以做一個有趣的事情是,XHR請求,並用返回的源使它成爲一個blob和負荷負載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'這樣的源代碼中取出並放到你的url欄中。我更喜歡@nmaiers方法

或者再看看@nmaier是如何將數據發佈到新標籤的。 (我愛他的方式)

+1

謝謝,最後我用http://stackoverflow.com/a/19403213/424072的postData和loadOneTab和moveTabTo方法打開並放置選項卡。 – 2014-10-31 21:26:52

+0

感謝您分享您最終的成果。它有助於未來遇到同樣東西的其他人。也爲我的知識:) – Noitidart 2014-10-31 22:39:06

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); 
    } 
}); 
+0

我知道我可以使用請求來發送請求,但我需要顯示生成的html到一個新的選項卡,所以這是行不通的。 具體而言,我需要模仿html表單的行爲。 – 2014-10-30 08:04:49

+0

@JérémieBertrand那麼爲什麼不把生成的HTML發送到新標籤並將其附加到文檔? – willlma 2014-10-30 18:56:00

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);