经过大量的争论和试验,在@nmaier 和@canuckistani 的慷慨帮助下,我能够构建一种将POST
数据从 Firefox 插件 (SDK) 中传输到正在运行的 Web 服务器node.js
(express
app.post()
用于获取POST
ed 数据)的方法。它看起来像这样:
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
应用程序,它获取POST
ed 数据并对其进行处理。不幸的是,我无法让它工作,因为我似乎无法从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
) 提取正常。
但我无法获得实际的POST
ed 有效载荷。正如我所说,我尝试了一个字符串和一个对象,但都没有任何结果;我得到一个空dataURL
变量({ }
或undefined
)。
我要发送的数据是由toDataURL()
HTML 5canvas
对象的函数创建的字符串;它是一个表示图像的 base64 编码字符串。所以它是一个带有几个额外符号的纯 ASCII 字符串,它是用 JavaScriptencodeURIComponent
函数编码的。到目前为止,大小相当小(我虽然这可能是个问题,但我目前正在发送大约 3K - 尽管我确实想发送更大的字符串 - 长度可达几百 Kb 左右)。
通常在 中node.js
,您从作为对象发送的request.body.<key-name>
数据中提取数据时使用,该对象是正在发送的数据值的键。我在应用程序中还有其他一些此类逻辑的实例,它们都可以正常工作(主要区别在于它是通过 jQuery 完成的,而不是在扩展中完成,而是在常规网页中完成。例如,POST
key-name
POST
$.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
编辑的数据。如果有人有想法,我将不胜感激。