2014-12-01 3 views
2

Я бы хотел отправить некоторые данные на внешний сервер в пределах расширения Firefox.Отправка данных на сервер с использованием JavaScript (Firefox Addon)

Я пробовал этот фрагмент кода, но он не работает из-за Same-Origin-Policy.

$.ajax({ 
    type: "POST", 
    url: 'https://127.0.0.1:54321', 
    data: ({foo: "bar"}), 
    crossDomain: true, 
    dataType: 'json' 
}).done(function() { 
    alert("done"); 
}).fail(function(xhr, status, error) { 
// var err = eval("(" + xhr.responseText + ")"); 
    alert((xhr.responseText)); 
}); 

Поскольку это не работает я попробовал этот учебник: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS Это меня этот кусок кода:

var invocation = new XMLHttpRequest(); var url = 'https://127.0.0.1:54321'; 
invocation.open('POST', url, true); 
invocation.setRequestHeader('X-PINGOTHER', 'pingpong'); 
invocation.setRequestHeader('Content-Type', 'application/xml'); 
invocation.onreadystatechange = handler; 
invocation.send(document.body); 

Этот код также не работает и Firefox подсказывает, что я должен использовать CORS.

Проводная вещь работает, если я не использую HTTPS (на не сайты HTTPS)

Примечание: На 'https://127.0.0.1:54321' работает Java SSLServerSocket.

Благодарим за помощь.

ответ

1

Скопируйте и вставьте этот:

var {Cu, Cc, Ci} = require('chrome'); //addon-sdk way 
//var {Cu: utils, Cc: classes, Ci: instances} = Components; //non addon-sdk 
Cu.import('resource://gre/modules/Services.jsm'); 
function xhr(url, cb) { 
    let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest); 

    let handler = ev => { 
     evf(m => xhr.removeEventListener(m, handler, !1)); 
     switch (ev.type) { 
      case 'load': 
       if (xhr.status == 200) { 
        cb(xhr.response); 
        break; 
       } 
      default: 
       Services.prompt.alert(null, 'XHR Error', 'Error Fetching Package: ' + xhr.statusText + ' [' + ev.type + ':' + xhr.status + ']'); 
       break; 
     } 
    }; 

    let evf = f => ['load', 'error', 'abort'].forEach(f); 
    evf(m => xhr.addEventListener(m, handler, false)); 

    xhr.mozBackgroundRequest = true; 
    xhr.open('GET', url, true); 
    xhr.channel.loadFlags |= Ci.nsIRequest.LOAD_ANONYMOUS | Ci.nsIRequest.LOAD_BYPASS_CACHE | Ci.nsIRequest.INHIBIT_PERSISTENT_CACHING; 
    //xhr.responseType = "arraybuffer"; //dont set it, so it returns string, you dont want arraybuffer. you only want this if your url is to a zip file or some file you want to download and make a nsIArrayBufferInputStream out of it or something 
    xhr.send(null); 
} 

xhr('https://www.gravatar.com/avatar/eb9895ade1bd6627e054429d1e18b576?s=24&d=identicon&r=PG&f=1', data => { 
    Services.prompt.alert(null, 'XHR Success', data); 
    var file = OS.Path.join(OS.Constants.Path.desktopDir, "test.png"); 
    var promised = OS.File.writeAtomic(file, data); 
    promised.then(
     function() { 
      alert('succesfully saved image to desktop') 
     }, 
     function(ex) { 
      alert('FAILED in saving image to desktop') 
     } 
    ); 
}); 
+0

Я получаю следующее сообщение об ошибке в моем IDE: Ожидаемое идент но нашел { Var {Cu: Utils, куб.см: классы, Ci: экземпляры} = требуется ('хром'); // addon-sdk way Ожидаемый операнд, но найденный = var {Cu: utils, Cc: classes, Ci: экземпляры} = require ('chrome'); // аддон-SDK путь –

+0

И SDK дает: console.error: anti_mitb: сообщение: ReferenceError: требуют не определен Stack: @Resource: //gre/modules/addons/XPIProvider.jsm -> баночка: файл: /// c:/users/testb e~1/appdata/local/temp/tmpbeakvl.mozrunner/extensions/[email protected] k.xpi! /bootstrap.js -> ресурс: // gre/модули/commonjs/toolkit/loader.js -> reso urce: //gre/modules/commonjs/sdk/loader/sandbox.js -> ресурс: // jid1-b6qouhmx7bw m6a-at-jetpack/anti_mitb/data/test.js: 1: 5 –

+0

обновленный код, теперь можно скопировать пачку в add-sdk. если вы хотите вставить это в NST-sdk, так что бутстрап закомментируйте строку 1 и раскомментируйте строку 2 – Noitidart

Смежные вопросы