jQuery publica json válido en el cuerpo de la solicitud

180

Entonces, de acuerdo con los documentos de jQuery Ajax , serializa datos en forma de una cadena de consulta al enviar solicitudes, pero la configuración processData:falsedebería permitirme enviar JSON real en el cuerpo. Desafortunadamente, estoy teniendo dificultades para determinar primero, si esto está sucediendo y, en segundo lugar, cómo se ve el objeto que se está enviando al servidor. Todo lo que sé es que el servidor no analiza lo que estoy enviando.

Cuando se usa el cliente http para publicar un objeto literal {someKey:'someData'}, funciona. Pero cuando se usa jQuery con data: {someKey:'someData'}, falla. Desafortunadamente cuando analizo la solicitud en Safari, dice que la carga útil del mensaje es [object Object]... genial ... y en Firefox la publicación está en blanco ...

Al registrar el contenido del cuerpo en el lado de Java, literalmente se obtiene, [object Object]¿cómo se envían datos de REAL JSON?

¿Alguien ha tenido experiencia con un servicio Java que serializa datos JSON en el cuerpo de la solicitud, con la solicitud enviada desde jQuery?

Por cierto, aquí está la solicitud completa de $ .ajax:

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

Respuestas:

292

Una solicitud JSON real se vería así:

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

Donde estás enviando una cadena JSON real. Para una solución más general, use JSON.stringify()para serializar un objeto a JSON, como este:

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

Para admitir navegadores más antiguos que no tienen el JSONobjeto, use json2.js que lo agregará.


Lo que está sucediendo actualmente es que processData: false, básicamente, está enviando esto: ({"command":"on"}).toString()que es [object Object]... lo que ves en tu solicitud.

Nick Craver
fuente
entonces, ¿ya no necesito el processData: false using JSON.stringify()?
Brad
66
@brad: correcto, no importará después de hacer esto porque ya es una cadena y, en ese caso, jQuery no lo procesará más .
Nick Craver
2
funcionó a las mil maravillas, muchas gracias! ¿Es cierto entonces que se espera que todos los cuerpos de solicitud sean cadenas que se analizan en el otro extremo?
Brad
¿Por qué jQuery analiza el texto dataen una cadena, en lugar de enviarlo simplemente como JSON?
Adam Zerner
Nota al margen: si alguien lo necesita como una "carga útil de solicitud del cuerpo" en lugar de datos de formulario, no olvide incluir contentType: "application/json; charset=utf-8",como se menciona en este hilo: stackoverflow.com/questions/21201270/…
raydlevel5