0

多くの論争と実験の後、@nmaier と @canuckistani の親切な助けによりPOST、Firefox アドオン (SDK) 内から実行中の Web サーバーにデータを転送する方法を構築することができました (データのフェッチにnode.js使用)。次のようになります。express app.post()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データを ing する2 つの方法を試しました。( encodeURIComponent-encoded) 文字列として、およびキーと値のペアが 1 つだけのオブジェクトとしてです。

サーバー側には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 でエンコードされた文字列です。つまり、JavaScriptencodeURIComponent関数でエンコードされた、いくつかの追加記号を含むプレーンな ASCII 文字列です。これまでのところ、サイズはかなり小さいです (それは問題かもしれませんが、現在、約 3K を送信しています。より大きな文字列を送信したいのですが、長さは最大で数百 Kb 程度です)。

通常 では、 が送信されるデータ値のキーであるオブジェクトとして送信されたからデータを抽出するときにnode.js使用します。アプリにはこの種のロジックのインスタンスが他にもいくつかありますが、それらはすべて正常に動作します (主な違いは、jQuery を介して実行され、拡張機能内ではなく通常の Web ページ内で実行されることです。たとえば、 、request.body.<key-name>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