2012-10-25 12 views
8

Niedawno zdałem sobie sprawę, że muszę użyć easyXDM zamiast jQuery's $.ajax, aby utworzyć żądanie wpisu między domenami. Po dostaniu easyXDM skonfigurować widzę, że funkcje kolejce dość ściśle:Jak mogę wysłać obiekt/tablicę javascript jako pary klucz-wartość za pośrednictwem posta AJAX z 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 jest ustawiony coś takiego:

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

Kiedy wykonuję żądanie z jQuery, obsługuje on prawidłowo pola podrzędne, ale nie w easyXDM.

Oto jak żądanie POST przychodzi do serwera z jQuery:

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

A oto jak to przychodzi z easyXDM:

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

Jak mogę wysłać obiekt javascript/tablica par klucz-wartość za pośrednictwem żądania easyXDM/XHR, takiego jak jQuery?

+0

Od docs: „Jeśli nie ustawiono easyXDM spróbuje użyć natywnej obiekt JSON”, więc jeśli nie jesteś przesłanianie serializatora wówczas obiekt powinien wychodzić jak można się spodziewać? Być może typ przymusu dzieje się gdzieś w poprzednim kodzie? – robC

+1

Wygląda na to, że może to być problem z easyXDM. Wygląda na to, że w pliku cors/index.html spróbuje serializować dane bez uprzedniego sprawdzenia, czy jest już ciągiem znaków i nie obsługuje wielopoziomowego kodowania JSON ... https: // github. com/oyvindkinsey/easyXDM/issues/199 – cwd

+1

@robC - odnośnie do twojego skasowanego komentarza Myślę, że to jest problem z easyXDM - zobacz mój test http://pastebin.com/0eusK2vr – cwd

Odpowiedz

4

W świetle ograniczeń easyXDM omówione w komentarzach, że jedynym sposobem można go używać byłoby ręcznie serializacji danych podczas przechodzenia go .request tj

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

Alternatywnie można stworzyć własny rozwiązanie postMessage, ale będziesz wykluczał IE7 i poniżej.

+0

To wygląda na sprytne obejście, dopóki problem ten nie zostanie rozwiązany. Spróbuję. –

+0

Bardzo sprytnie! najprostsze rozwiązanie, przynajmniej na razie! dzięki! :) –

+0

@SteveBrown nie zapomnij uwzględnić implementacji JSON dla IE7! https://github.com/douglascrockford/JSON-js – robC

2

Myślę, że mylisz się, wysyłając żądanie między domenami za pośrednictwem AJAX. Możesz rzeczywiście wysłać żądanie między domenami poprzez AJAX, niezależnie od JavaScript API. Jednak aby otrzymać odpowiedź międzydomenową, odpowiedź musi być typu danych: JSONP.

JSONP po prostu JSON z wypełnieniem, np

JSON:

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

JSONP:

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

jest subtelne różnice ale JSONP po przejściach zasady samego pochodzenia przeglądarki i pozwala na korzystanie z danych JSON obsługiwanych przez inny serwer.

Aby zużywają danych JSON pochodzących z innego serwera poprzez jQuery AJAX spróbuj tego:

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

dla tej pracy należy upewnić się, że Twój serwis internetowy zwraca wyniki jak JSONP i nie JSON.

+0

easyXDM używa ukrytego elementu iframe z postMessage, a nie jsonp! – robC

+0

Próbuję użyć easyXDM, ponieważ żądania ajax domeny crossowej jQuery nie są obsługiwane we wszystkich przeglądarkach. –

+0

@SteveBrown JSONP będzie działać we wszystkich przeglądarkach. Ale nie możesz użyć testu POST, ponieważ jest to żądanie GET. – robC

1

Jak easyXDM nie można szeregować właściwie trzeba szeregować dane ręcznie:

JSON.stringify(myData) 

Ponieważ wniosek będzie teraz zawierać ciąg json zamiast obiektu następnie Index.html nie powinien analizować właściwości, aby utworzyć strukturę json . Idź do index.html, który pochodzi z easyXDM i zlokalizuj następujący kod:

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

Nie wykonanie tego kodu w przypadku żądania POST. Wystarczy przypisać config.data do danych:

data = config.data; 
Powiązane problemy