经过大量的争论和试验,在@nmaier 和@canuckistani 的慷慨帮助下,我能够构建一种将POST数据从 Firefox 插件 (SDK) 中传输到正在运行的 Web 服务器node.js(express app.post()用于获取POSTed 数据)的方法。它看起来像这样:
var { Cc, Cu, Ci, Cr, Cm, components } = require('chrome');
var oReq = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
oReq.open('POST', targetURL);
oReq.setRequestHeader('Content-Type', 'text/plain');
oReq.onreadystatechange = function()
{
// readyState and status status handlers here...
};
oReq.send({ data : aURIEncodedString }); // object variant
并且
oReq.send( aURIEncodedString ); // string variant
我尝试了两种POST获取数据的方法:作为(-encodeURIComponent编码)字符串和只有一个键值对的对象。
在服务器端是一个node.js应用程序,它获取POSTed 数据并对其进行处理。不幸的是,我无法让它工作,因为我似乎无法从POST. 它看起来像这样:
app.post('/grab/:fid', function(request, response)
{
var filename = request.param('fid');
var dataURL = request.body.data; // (and also just "request.body")
...
...
}
所以在这里我使用express中间件,用app.VERB(POST在这种情况下)POST从客户端接收数据。到这里工作正常:targetURL来自客户端的正确指向这里并在此处捕获,执行此代码,参数 ( filename) 提取正常。
但我无法获得实际的POSTed 有效载荷。正如我所说,我尝试了一个字符串和一个对象,但都没有任何结果;我得到一个空dataURL变量({ }或undefined)。
我要发送的数据是由toDataURL()HTML 5canvas对象的函数创建的字符串;它是一个表示图像的 base64 编码字符串。所以它是一个带有几个额外符号的纯 ASCII 字符串,它是用 JavaScriptencodeURIComponent函数编码的。到目前为止,大小相当小(我虽然这可能是个问题,但我目前正在发送大约 3K - 尽管我确实想发送更大的字符串 - 长度可达几百 Kb 左右)。
通常在 中node.js,您从作为对象发送的request.body.<key-name>数据中提取数据时使用,该对象是正在发送的数据值的键。我在应用程序中还有其他一些此类逻辑的实例,它们都可以正常工作(主要区别在于它是通过 jQuery 完成的,而不是在扩展中完成,而是在常规网页中完成。例如,POSTkey-namePOST
$.post("http://mydomain.herokuapp.com/queue",
{
URL : URL,
Title : URLTitle,
ToWhom : ID
}).done(function(data) .....
和
app.post('/queue', function(request, response)
{
DB.myShopping(request.body.ToWhom, request.body.Title, request.body.URL, ....
这完美地工作。
所以我需要知道nsIXMLHttpRequest版本如何打包要POST编辑的数据,以及我需要如何在服务器端构造接收器来捕获正在POST编辑的数据。如果有人有想法,我将不胜感激。