使用nsIXMLHttpRequest发布到服务器时,POST有效负载是什么样的?

时间:2013-09-20 00:16:26

标签: javascript node.js xmlhttprequest firefox-addon firefox-addon-sdk

经过多次争吵和实验,并在@nmaier和@canuckistani的亲切帮助下,我能够构建一种POST从Firefox Addon(SDK)中的数据到运行在{ {1}}(使用node.js express获取app.post() ed数据)。它看起来像这样:

POST

,还有

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中提取数据。它看起来像这样:

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 ed有效负载。正如我所说的那样,我尝试了一个字符串和一个对象,但两者都没有结果;我得到一个空的POST变量(dataURL{ })。

我要发送的数据是由HTML 5 undefined对象的toDataURL()函数创建的字符串;它是一个base64编码的字符串,代表一个图像。所以它是一个普通的ASCII字符串,带有几个额外的符号,用JavaScript canvas函数编码。到目前为止,尺寸相当小(虽然这可能是一个问题,但我目前正在发送大约3K - 尽管我确实希望发送更大的字符串 - 长度达到几百Kb左右。)

通常在encodeURIComponent中,当您从作为对象发送的node.js中提取数据时使用request.body.<key-name>,其中POST是要发送的数据值的关键字。我在应用程序中有这种逻辑的一些其他实例,它们都工作正常(关键区别在于key-name是通过jQuery完成的,并且不是从在扩展中,但在常规网页中。例如,

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编辑的数据。如果有人有想法,我会非常感激地了解他们。

1 个答案:

答案 0 :(得分: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);