2010-11-11 12 views
123

De acuerdo con jQuery Ajax docs, serializa los datos en forma de una cadena de consulta al enviar solicitudes, pero la configuración processData:false debería permitirme enviar JSON real en el cuerpo. Lamentablemente, estoy teniendo dificultades para determinar primero, si esto está sucediendo, y el segundo aspecto del objeto que se envía al servidor. Todo lo que sé es que el servidor no está analizando lo que estoy enviando.jQuery publicando json válido en el cuerpo de solicitud

Cuando se usa http client para publicar un objeto literal {someKey:'someData'}, funciona. Pero al usar 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 Java, literalmente obtiene [object Object] Entonces, ¿cómo se envía una información REAL JSON?

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

Por cierto aquí es la solicitud $ .ajax completo:

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

Respuesta

206

una solicitud real JSON se vería así:

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

Cuando usted está enviando una cadena real JSON. Para una solución más general, utilizar JSON.stringify() para serializar un objeto a JSON, como esto:

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

la compatibilidad con navegadores antiguos que no tengan por objeto JSON, utilice json2.js que se sumarán en


.

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

+0

así que ya no necesito el processData: false usando 'JSON.stringify()'? – brad

+4

@brad: correcto, no importará después de hacer esto porque ya es * una cadena, y en ese caso [jQuery no lo procesará más] (https://github.com/jquery/jquery/blob/ 1.4.3/src/ajax.js # L207). –

+1

funcionó como un encanto, muchas gracias! ¿Es cierto entonces que se espera que todos los cuerpos de solicitud sean cadenas que se analizan en el otro extremo? – brad

Cuestiones relacionadas