2009-11-17 17 views
54

Próbuję umieścić niektóre dane sformatowane JSON przez Ajax z jQuery na serwerze. Mój kod wygląda następująco:jQuery - jak umieścić JSON przez Ajax?

$.ajax({ 
    type: "PUT", 
    url: myURL, 
    contentType: "application/json", 
    data: {"data": "mydata"} 
}); 

Ale po stronie serwera, otrzymuję data=mydata ciąg, zamiast oczekiwanego JSON. Firebug mówi to samo.

Gdzie jest błąd?

+0

Co używasz na stronie serwera? –

+0

Używam Couchdb, który oczekuje JSON. –

+6

AJAX PUT * jest * dostępny we wszystkich głównych przeglądarkach. HTTP PUT nie jest. Tak więc w tym przypadku jest w porządku (zalecane, parzyste), aby użyć PUT. –

Odpowiedz

46

Myślę, że dane muszą być ciągiem. Obiekty są konwertowane na ciągi zapytań, które widzisz tutaj. Można użyć metody JSON.stringify(obj) do konwersji obiektu na ciąg. Kod obiektu JSON jest dostępny pod adresem: https://github.com/douglascrockford/JSON-js/blob/master/json2.js.

Alternatywnie, wystarczy podać kod, którego używasz do utworzenia obiektu jako literalnego ciągu znaków, ale wyobrażam sobie, że jest to tylko przykład i chcesz zakodować obiekt, który już utworzyłeś.

+1

W ten sposób powinien przejść @Juri, jeśli chce JSON na serwerze. Korzystam z biblioteki json2.js przez cały czas i działa świetnie. –

+3

byłoby miło, gdyby jQuery wiązał dane, tak samo jak z POST. – neoneye

+1

Zaktualizowany link: https://github.com/douglascrockford/JSON-js/blob/master/json2.js – Ben

30

Jeśli zawsze musisz wysłać JSON do swojej aplikacji, możesz po prostu wykonać to gdzieś w swoim init, a następnie użyć domyślnego połączenia $.ajax jak w twoim przykładzie, i zawsze będzie serializować jako ciąg JSON zamiast domyślnego Ajax ciąg zapytania.

Tutaj używam obiekt JSON wymienionych powyżej:

$.ajaxSetup({ 
    contentType : 'application/json', 
    processData : false 
}); 
$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
    if (options.data){ 
     options.data=JSON.stringify(options.data); 
    } 
}); 
1
//url: this is a reference to the XML, where you need to define the mapping. 
//<entry key="/getEmpDetails/transEfileGenerate.app"> 
//<bean class="com.adp.ems.framework.spring.MappingItem" p:delegate-ref="efilePageDelegate" 
//p:action="passJSONObjectAndGetWebServiceOutput" /> 

//str1 is the input JSON that you need to pass... Ajax will automatically take care to get the response. 
//</entry> 

var kw = { 
    url : "getEmpDetails/transEfileGenerate.app", 
    timeout : 30000, 
    handleAs : "json", 
    sync: false, 
    putData : str1, 
    headers: { "Content-Type": "application/json"}, 
    load : function(result) { 
}, 
Powiązane problemy