0

经过大量的争论和试验,在@nmaier 和@canuckistani 的慷慨帮助下,我能够构建一种将POST数据从 Firefox 插件 (SDK) 中传输到正在运行的 Web 服务器node.jsexpress 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.VERBPOST在这种情况下)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编辑的数据。如果有人有想法,我将不胜感激。

4

1 回答 1

2

好吧,首先,让我们看看$.post()产生了什么:

$.post("/", { 
    URL     : "test &&", 
    Title   : "ting",
    ToWhom  : "this" 
});

发送以下请求:

X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 38

URL=test+%26%26&Title=ting&ToWhom=this

不,让我们先看看request模块(由于某种原因你仍然忽略)会发送什么:

Request({
    url: "http://example.org/",
    content: { 
        URL     : "test &&", 
        Title   : "ting",
        ToWhom  : "this" 
    },
    onComplete: function (response) {
        console.log("complete");
    }
  }
).post();

回复:

Content-Type:   application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 38

URL=test+%26%26&Title=ting&ToWhom=this

答对了!

现在,如果您仍然想使用nxIXMLHttpRequest更好的建议,那么您需要自己正确编码数据,也许在querystring模块的帮助下:

var { Cc, Cu, Ci, Cr, Cm, components } = require('chrome');
const {stringify:querystring} = require("sdk/querystring");
var oReq = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
oReq.open('POST', "http://example.org");
oReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
data = querystring({ 
    URL     : "test &&", 
    Title   : "ting",
    ToWhom  : "this" 
});
oReq.send(data);
于 2013-09-20T01:34:10.727 回答