2012-10-25 2 views
8

Recentemente mi sono reso conto che dovevo usare easyXDM invece di $.ajax di jQuery per fare una richiesta di post interdominio. Dopo aver ottenuto easyXDM istituito vedo che le funzioni si allineano abbastanza da vicino:Come posso inviare un oggetto/array javascript come coppie chiave-valore tramite un post AJAX con easyXDM?

jQuery:

$.ajax({ 
    url: "/ajax/", 
    method: "POST", 
    data: myData 
}); 

easyXDM:

xhr.request({ 
    url: "/ajax/", 
    method: "POST", 
    dataType: 'json', // I added this trying to fix the problem, didn't work 
    data: myData 
}); 

myData è messa a punto qualcosa di simile:

myData = {}; 
myData[1] = 'hello'; 
myData[2] = 'goodbye'; 
myData[3] = {}; 
myData[3][1] = 'sub1'; 
myData[3][2] = 'sub2'; 
myData[3][3] = 'sub3'; 

Quando faccio la richiesta con jQuery gestisce correttamente i sottocampi, ma non con easyXDM.

Ecco come la richiesta POST viene al server con jQuery:

screenshot-with-shadow.png http://img37.imageshack.us/img37/4526/screenshotwithshadow.png

Ed ecco come si arriva con easyXDM:

screenshot-with-shadow.png http://img204.imageshack.us/img204/4526/screenshotwithshadow.png

Come posso inviare una javascript object/array di coppie chiave-valore tramite una richiesta easyXDM/XHR come fa jQuery?

+0

Dalla documentazione: "Se non impostato easyXDM tenterà di utilizzare l'oggetto JSON nativo", quindi a meno che non si sta eseguendo l'override del serializzatore allora il vostro oggetto deve venire fuori come ci si aspetta? Forse la coercizione di tipo sta accadendo da qualche parte nel tuo codice precedente? – robC

+1

Sembra che questo potrebbe essere un problema con easyXDM. Sembra che nel file cors/index.html proverà e serializzerà i dati senza prima controllare se è già una stringa e non sembra gestire la codifica JSON multilivello ... https: // github. com/oyvindkinsey/easyXDM/issues/199 – cwd

+1

@robC - per quanto riguarda il tuo commento ora cancellato Penso che sia un problema con easyXDM - vedi il mio test http://pastebin.com/0eusK2vr – cwd

risposta

4

Alla luce delle limitazioni del easyXDM discusso nei commenti, l'unico modo è possibile utilizzarlo sarebbe quello di serializzare i dati manualmente quando si passa a .request cioè

xhr.request({ 
    url: "/ajax/", 
    method: "POST", 
    data: {jsonData: JSON.stringify(myData)} 
}); 

In alternativa è possibile creare il proprio soluzione postMessage ma escluderai IE7 e versioni successive.

+0

Questo sembra una soluzione intelligente finché il problema non si risolve. Farò un tentativo. –

+0

davvero molto intelligente! soluzione più semplice, almeno per ora! Grazie! :) –

+0

@SteveBrown non dimenticare di includere un'implementazione JSON per IE7! https://github.com/douglascrockford/JSON-js – robC

2

Penso che tu abbia sbagliato nell'inviare una richiesta tra domini tramite AJAX. È possibile infatti inviare una richiesta di dominio incrociato tramite AJAX indipendentemente dall'API JavaScript. Tuttavia, per ricevere una risposta tra domini, la risposta deve essere del tipo di dati JSONP.

JSONP è semplicemente JSON con imbottitura, per esempio:

JSON:

{ Key: "Hello", Value: "World" } 

JSONP:

callback({ Key: "Hello", Value: "World" }) 

È una differenza sottile ma JSONP by-pass browser stesso criterio di origine e consente di utilizzare i dati JSON serviti da un altro server.

di consumare dati JSON provenienti da un altro server tramite jQuery AJAX provare questo:

$.ajax({ 
    url: "http://mydomain.com/Service.svc/GetJSONP?callback=callback", 
    dataType: "jsonp", 
    data: myData, 
    success: function(data) { 
     alert(data); 
    } 
}); 

Per far funzionare tutto questo è necessario assicurarsi che il vostro servizio web sta tornando risultati come JSONP e non JSON.

+0

easyXDM utilizza un iframe nascosto con postMessage, non jsonp! – robC

+0

Sto cercando di utilizzare easyXDM perché le richieste di javery su dominio incrociato di jQuery non sono supportate in tutti i browser. –

+0

@SteveBrown JSONP funziona con tutti i browser. Ma non puoi usare POST deve essere una richiesta GET. – robC

1

Come easyXDM non può serializzare correttamente è necessario serializzare i dati manualmente:

JSON.stringify(myData) 

Dal momento che la richiesta sarà ora contenere una stringa JSON piuttosto che oggetto poi Index.html non dovrebbe analizzare le proprietà per creare la struttura JSON . Vai a index.html che viene fornito con easyXDM e individuare il seguente codice:

var pairs = []; 
for (var key in config.data) { 
    if (config.data.hasOwnProperty(key)) { 
     pairs.push(encodeURIComponent(key) + "=" + encodeURIComponent(config.data[key])); 
    } 
} 
data = pairs.join("&"); 

Non eseguire questo codice in un caso di richiesta POST. Basta assegnare config.data ai dati:

data = config.data;