2012-06-19 8 views
36

Me gustaría PUBLICAR una matriz de objetos con $ .ajax en Zepto o Jquery. Ambos exhiben el mismo error extraño, pero no puedo encontrar lo que estoy haciendo mal.

La información se guarda en el servidor cuando se envía utilizando un cliente de prueba como 'RestEasy', y puedo ver que la solicitud se destrozó en el panel de red del navegador, así que creo que JS es el culpable.

Si envío una matriz de objetos como propiedad de datos de una POST, no se envían correctamente.

objeto

datos:

var postData = [ 
    { "id":"1", "name":"bob"} 
    , { "id":"2", "name":"jonas"} 
    ] 

Solicitud:

$.ajax({ 
    url: _saveDeviceUrl 
, type: 'POST' 
, contentType: 'application/json' 
, dataType: 'json' 
, data: postData 
, success: _madeSave.bind(this) 
//, processData: false //Doesn't help 
}); 

cuerpo de la petición como se ve en el navegador:

"bob=undefined&jonas=undefined" 

Esto se puede ver de forma más directa mediante el uso de los $ .PARAM método que jQuery y Zepto usan para preparar datos POST.

$.param(
    [ 
    { "id":"1", "name":"bob"} 
    , { "id":"2", "name":"jonas"} 
    ] 
) 
// Output: "bob=undefined&jonas=undefined" 

Parece que la preparación que estas bibliotecas hacen para datos de publicación complejos es diferente de lo que esperaba.

Veo esta respuesta, pero no quiero enviar los datos como un parámetro de consulta ya que estoy PUBLICANDO un montón de contenido. How do I send an array in an .ajax post using jQuery?

¿Cuál es la forma correcta de enviar varios objetos a través de POST usando jQuery/Zepto?

Usando $ .ajax ({... data: JSON.stringify (postData) ...}) envía contenido no triturado, pero al servidor no le gusta el formato.

Actualización: Parece que JSON.stringify envía contenido correctamente formateado. El problema es que el lado del servidor es muy, muy específico sobre la estructura del objeto que quiere. Si agrego o elimino alguna propiedad del objeto, fallará todo el proceso en lugar de usar las propiedades que coinciden. Esto es inconveniente porque es agradable usar contenido enviado por el servidor como un modelo de vista, pero los modelos de vista se cambian. ... Seguimos trabajando en la mejor solución.

+0

¿Recibe estos datos usando PHP? En caso afirmativo, puede intentar usar [.serialize()] (http://api.jquery.com/serialize/), pero deberá agregar '[]' al final de los nombres de las variables y recibirlos como arrays –

Respuesta

70

Asegúrese de stringify antes de enviar. Me apoyé demasiado en las bibliotecas y pensé que codificarían correctamente en función del tipo de contenido que publicaba, pero parece que no.

Obras:

$.ajax({ 
    url: _saveAllDevicesUrl 
, type: 'POST' 
, contentType: 'application/json' 
, data: JSON.stringify(postData) //stringify is important 
, success: _madeSave.bind(this) 
}); 

prefiero este método para usar un plugin como $ .toJSON, aunque eso lograr la misma cosa.

+0

Hola, solo uno rápido. Construí una lista de parámetros como una cadena en formato URL a través de unas pocas instrucciones '+ =', p. Ej. 'x = 123 & y = 1234 & z = 12345' ... ahora es bastante largo ser honesto ... muy largo. También conozco la URL, así que ¿puedo teóricamente hacer 'data: myParamString', o necesito JSON.stringify también? Gracias, sé que esta es una pregunta antigua – shanehoban

+1

@shanehoban en un POST, los parámetros se envían generalmente en el cuerpo, no como parámetros de URL. ¿Estás haciendo un GET? En cualquier caso, no creo que esto esté muy relacionado. Puede que quiera abrir una pregunta diferente. – SimplGy

+0

Gracias, ahora lo entiendo - esto fue hace un tiempo :) @Simple lo aprecié! – shanehoban

4

edición: supongo que ahora está empezando a ser segura para utilizar la JSON.stringify() método nativo, con el apoyo de most browsers (sí, incluso IE8 + si se está preguntando).

tan simple como:

JSON.stringify(yourData) 

Usted debe codificar datos en JSON antes de enviarlo, no se puede simplemente enviar un objeto como éste como datos POST.

Recomiendo usar el jQuery json plugin para hacerlo.A continuación, puede utilizar algo como esto en jQuery:

$.post(_saveDeviceUrl, { 
    data : $.toJSON(postData) 
}, function(response){ 
    //Process your response here 
} 
); 
+1

Ya es un objeto javascript, pensé que la conversión era trivial o automáticamente manejada por estas bibliotecas. ¿Qué conversión está haciendo realmente entre el objeto js y el objeto de transferencia JSON? ¿Es esto lo mismo que JSON.stringify? – SimplGy

11

intente lo siguiente:

$.ajax({ 
    url: _saveDeviceUrl 
, type: 'POST' 
, contentType: 'application/json' 
, dataType: 'json' 
, data: {'myArray': postData} 
, success: _madeSave.bind(this) 
//, processData: false //Doesn't help 
}); 
+0

Ese es un mejor enfoque ya que una matriz en javascript por sí misma no es un JSON. Incluso {[]} no es válido. La matriz debe estar envuelta por un Objeto y dentro de una propiedad. –

+1

Gracias, la mejor solución es la tuya. Me ha ayudado a enviar una matriz de objetos con ajax a mi API web ASP.net. –

Cuestiones relacionadas