jQuery pubblica json valido nel corpo della richiesta


180

Quindi, secondo i documenti jQuery Ajax , serializza i dati sotto forma di una stringa di query durante l'invio di richieste, ma l'impostazione processData:falsedovrebbe consentirmi di inviare JSON effettivo nel corpo. Sfortunatamente non riesco a determinare prima se ciò sta accadendo e in secondo luogo come appare l'oggetto che viene inviato al server. Tutto quello che so è che il server non sta analizzando ciò che sto inviando.

Quando si utilizza il client http per pubblicare un oggetto letterale {someKey:'someData'}, funziona. Ma quando si utilizza jQuery con data: {someKey:'someData'}, non riesce. Sfortunatamente quando analizzo la richiesta in Safari, dice che il payload del messaggio è [object Object]... fantastico ... e in Firefox il post è vuoto ...

Quando si registra il contenuto del corpo sul lato Java, diventa letteralmente [object Object]così come si inviano i dati REAL JSON ??

Qualcuno ha avuto esperienza con un servizio Java che serializza i dati JSON nel corpo della richiesta, con la richiesta inviata da jQuery?

A proposito ecco la richiesta $ .ajax completa:

$.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'
});

Risposte:


293

Una richiesta JSON effettiva sarebbe simile a questa:

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

Dove stai inviando una stringa JSON effettiva. Per una soluzione più generale, utilizzare JSON.stringify()per serializzare un oggetto su JSON, in questo modo:

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

Per supportare i browser più vecchi che non hanno l' JSONoggetto, utilizzare json2.js che lo aggiungerà.


Quello che sta succedendo attualmente è che hai processData: false, sostanzialmente sta inviando questo: ({"command":"on"}).toString()che è [object Object]... quello che vedi nella tua richiesta.


quindi non ho più bisogno di processData: false using JSON.stringify()?
Brad

6
@brad - corretto, non importa dopo averlo fatto perché è già una stringa, e in tal caso jQuery non la elaborerà ulteriormente .
Nick Craver

2
ha funzionato come un incantesimo, molte grazie! È vero quindi che ci si aspetta che tutti i corpi di richiesta siano stringhe che vengono analizzate dall'altra parte?
Brad

Perché jQuery analizza il file datain una stringa, invece di inviarlo semplicemente come JSON?
Adam Zerner,

Nota a margine: se qualcuno ha bisogno come una "richiesta di payload corpo" invece di dati del modulo, non dimenticate di includere contentType: "application/json; charset=utf-8",, come menzionato in questa discussione: stackoverflow.com/questions/21201270/...
raydlevel5
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.