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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.