2013-08-03 12 views
5

Więc mam ten kod:ajax POST nie wysyłając część obiektu

var ajaxUrl = 'a/7776/as'; 
var data = { 
    'answer' : { 'user_input' : [] }, 
    'form_build_id' : 'form-ffe6f10e9601470ed4cfe38257a959a6' 
} 
$.ajax({ 
    url: ajaxUrl, 
    dataType: 'json', 
    type: 'POST', 
    data: data, 
    success: function(json){ 
    } 
    }); 

Jednak gdy kontrolowane źródło POST wydaje się, że „odpowiedź” nie jest wysyłany ..

Oto źródło POST w Firebug:

Parametersapplication/x-www-form-urlencoded 
form_build_id form-ffe6f10e9601470ed4cfe38257a959a6 
Source 
form_build_id=form-ffe6f10e9601470ed4cfe38257a959a6 

Dlaczego tak się dzieje i jak mogę go również wysłać „odpowiedzieć” część obiektu do postu AJAX?

Odpowiedz

0

Dobre wyjaśnienie z T.J. Crowder, wyraźnie kompetentny. Oto moje podejście do praktycznej odpowiedzi. Sprawdziłem mój ruch HTTP i wykonałem powyższą prośbę AJAX. Zgodnie z oczekiwaniami, answer nie został wysłany. Idąc dalej z odpowiedzią na adrenalinę powyżej, jeśli wyszukasz hasło "ajax nie wysyłając pustej tablicy" w google, zobaczysz tylko liczbę powiązanych wyników, która jest również problemem. Co zrobić, jeśli user_input jest pustą tablicą, zamiast tego wyślij null.Sam spróbowałem, aby się upewnić i, zgodnie z oczekiwaniami, tym razem zaobserwowałem parametr answer wysyłany w żądaniu wraz z user_input, który został wysłany jako null z kodem poniżej.

var userInput = []; //not sure where this is coming from in reality, but this is just an example. 

if (userInput.length == 0){ //in this example, this is obviously always true 
    userInput = null; 
} 
var ajaxUrl = 'a/7776/as'; 

var data = { 
    'answer' : { 'user_input' : userInput }, 
    'form_build_id' : 'form-ffe6f10e9601470ed4cfe38257a959a6' 
} 
$.ajax({ 
    url: ajaxUrl, 
    dataType: 'json', 
    type: 'POST', 
    data: data, 
    success: function(json){ 
    } 
}); 
0

Musisz ustawić traditional na true, jeśli chcesz, aby ładunek zawierał tablicę.

$.ajax({ 
    url: ajaxUrl, 
    dataType: 'json', 
    type: 'POST', 
    data: data, 
    traditional: true, 
    success: function (json) {} 
}); 
+0

Po prostu powoduje, że wysyła "' [Obiekt obiektu] "jako wartość, mało przydatny. –

3

Domyślne kodowanie POST jest multipart/form-data, która składa się z płaskiej serii name=value parami.

Twoja struktura nie może być odwzorowana bezpośrednio na płaską serię par name=value, ponieważ jest złożona. Masz element, który jest obiektem, który ma właściwość odnoszącą się do tablicy.

Jeśli chcesz wysłać dowolnie złożoną strukturę, musisz użyć innego kodowania i upewnić się, że serwer rozumie kodowanie. Na przykład możesz wysłać JSON lub XML do serwera, ale musisz powiedzieć, że to właśnie robisz, ustawiając właściwość contentType na metodzie ajax (która określa typ wysyłanych danych do na serwerze). Wtedy twój serwer musi zrozumieć, jak deserializować ten JSON lub XML.

Co jakiś czas upewnij się, że twoja struktura może zostać odwzorowana na płaską serię par name=value.

Pół sposób dom jest do przesyłania danych jak multipart/form-data, ale gdzie można wysłać pojedynczą name=value parę i mają value część być inna kodowania, tak:

$.ajax({ 
    url: ajaxUrl, 
    dataType: 'json', 
    type: 'POST', 
    data: {json: JSON.stringify(data)}, 
    success: function(json){ 
    } 
}); 

który wysyła pojedynczy name=value parę o nazwie json, gdzie wartość jest łańcuchem zakodowanym w JSON. Twoja strona serwera pobierze wartość parametru json w normalny sposób, a następnie użyje deserializatora JSON do odtworzenia wykresu obiektów.

Ta technika w połowie drogi jest czasami przydatna w frameworkach, które utrudniają użycie czegoś innego niż standardowe kodowanie żądań.

1

Ponieważ nie można wysłać tablicy o zerowej długości. Klucze POST (lub zapytania HTTP) nie zawierają żadnych informacji o typie, a macierz o zerowej długości skutecznie zbudowałaby wartość zerową w treści POST: message = [] będzie serializować na ".

+1

To odpowiada na pierwotne pytanie, więc każdy, kto go zaaprobuje, ma oświecić jego motyw. – adrenalin

+0

+1 Pierwotne pytanie brzmi: dlaczego nie jest wysyłane, a to jest odpowiedź. To niekoniecznie rozwiązuje problem PO, ale zależy to od czynników, które nie są zawarte w pytaniu. Dzięki tej wiedzy mógłby przynajmniej znaleźć inne rozwiązanie. Wytłumaczenie upadku byłoby tutaj świetne ... –