经过多次争吵和实验,并在@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
编辑的数据。如果有人有想法,我会非常感激地了解他们。
答案 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);