jQuery veröffentlicht gültigen json im Anfragetext

178

Gemäß den jQuery Ajax-Dokumenten werden beim Senden von Anforderungen Daten in Form einer Abfragezeichenfolge serialisiert. Die Einstellung processData:falsesollte es mir jedoch ermöglichen, tatsächlich JSON im Hauptteil zu senden. Leider fällt es mir schwer, erstens festzustellen, ob dies geschieht, und zweitens, wie das Objekt aussieht, das an den Server gesendet wird. Ich weiß nur, dass der Server nicht analysiert, was ich sende.

Wenn Sie mit dem http-Client ein Objektliteral veröffentlichen {someKey:'someData'}, funktioniert dies. Bei Verwendung von jQuery mit data: {someKey:'someData'}schlägt dies jedoch fehl. Wenn ich die Anfrage in Safari analysiere, heißt es leider, dass die Nachrichtennutzlast [object Object]... großartig ... ist und in Firefox der Beitrag leer ist ...

Wenn der Body-Inhalt auf der Java-Seite protokolliert wird, wird er buchstäblich angezeigt. [object Object]Wie sendet man also REAL JSON-Daten?

Hat jemand Erfahrung mit einem Java-Dienst, der JSON-Daten im Anforderungshauptteil mit der von jQuery gesendeten Anforderung serialisiert?

Übrigens ist hier die vollständige $ .ajax-Anfrage:

$.ajax({
    contentType: 'application/json',
    data: {
        "command": "on"
    },
    dataType: 'json',
    success: function(data){
        app.log("device control succeeded");
    },
    error: function(){
        app.log("Device control failed");
    },
    processData: false,
    type: 'POST',
    url: '/devices/{device_id}/control'
});
Brad
quelle

Antworten:

292

Eine tatsächliche JSON-Anfrage würde folgendermaßen aussehen:

data: '{"command":"on"}',

Wohin Sie eine tatsächliche JSON-Zeichenfolge senden. Verwenden Sie für eine allgemeinere Lösung JSON.stringify()Folgendes, um ein Objekt in JSON zu serialisieren:

data: JSON.stringify({ "command": "on" }),

JSONVerwenden Sie json2.js, um ältere Browser zu unterstützen, die das Objekt nicht haben .


Was gerade passiert, ist, seit Sie es haben processData: false, es sendet im Grunde das: ({"command":"on"}).toString()was [object Object]... was Sie in Ihrer Anfrage sehen.

Nick Craver
quelle
Brauche ich die processData: false using nicht mehr JSON.stringify()?
Brad
6
@brad - richtig, es spielt danach keine Rolle mehr, da es sich bereits um eine Zeichenfolge handelt, und in diesem Fall wird sie von jQuery nicht weiter verarbeitet .
Nick Craver
2
hat wie ein Zauber funktioniert, vielen Dank! Stimmt es dann, dass von allen Anforderungskörpern erwartet wird, dass sie Zeichenfolgen sind, die am anderen Ende analysiert werden?
Brad
Warum analysiert jQuery das datain einen String, anstatt ihn nur als JSON zu senden?
Adam Zerner
Randnotiz: Wenn jemand es als "Body Request Payload" anstelle von Formulardaten benötigt, vergessen Sie nicht, contentType: "application/json; charset=utf-8",wie in diesem Thread erwähnt anzugeben
raydlevel5