2012-02-22 10 views
6

Actualmente estoy trabajando en una aplicación PhoneGap que se comunica con nuestra base de datos a través de un servicio web WCF.WCF Service acepta una cadena JSON simple pero rechaza el conjunto JSON con el error 400

He realizado muchas solicitudes al servidor y he recuperado datos sin problemas, pero en cada caso solo estaba pasando un par de parámetros como una cadena JSON que he creado manualmente (sin stringify). Ahora he encontrado un problema al intentar leer desde mi base de datos SQLite local y luego enviar la información como JSON al servicio web. El servicio devuelve un error 400 con lo siguiente:

Error al deserializar el cuerpo del mensaje de solicitud para la operación 'uploadData'. OperationFormatter encontró un cuerpo de mensaje no válido. Se espera que encuentre un atributo con el nombre 'tipo' y el valor 'objeto'. Valor encontrado 'matriz'.

estoy que codifica el JSON de la siguiente manera:

database.transaction(function(tx) { 
    var query = "SELECT * FROM someTable WHERE something=something"; 
    tx.executeSql(query, [], function(tx, results) { 
     var resultSet = new Array(); 

     for (i=0; i<results.rows.length; i++) { 
      var row = results.rows.item(i); 
      resultSet[i] = row;   
     } 

     var json = JSON.stringify(resultSet); 
    } 
} 

que luego envía la cadena JSON a través de una petición AJAX usando jQuery:

$.ajax({ 
      type: "POST", 
      url: "http://someurl/myService.svc/uploadData", 
      contentType: "application/json; charset=utf-8", 
      data: json, 
      dataType: "json", 
      success: function (data) {/*do something*/}, 
      error: function(jqXHR, textStatus, errorThrown) { 
       $('#test').html(textStatus + " - " + errorThrown + " - " + jqXHR.responseText); 
      } 
     }); 

Mi servicio web sólo sigue echando hacia atrás el mismo error. Mi pregunta es esta ... ¿Cómo puedo leer desde la base de datos local y convertir el conjunto de resultados en una cadena JSON utilizable que se enviará a través de ajax.

Gracias de antemano. Si necesita más información o si el problema no está claro, hágamelo saber y haré todo lo posible para proporcionar más información.

EDIT: Intenté eliminar el stringify pero sigo recibiendo un error de 400. El error es un poco diferente esta vez:

Error al deserializar el cuerpo del mensaje de solicitud para la operación 'uploadData'. OperationFormatter encontró un cuerpo de mensaje no válido. Encontrado inesperado personaje 'u'.

EDIT: Descubrí que incluso una cadena JSON creada a mano que sea perfectamente válida sigue causando el error. No ocurre al enviar un par de parámetros como:

{"name" : "dean", "age" : 23} 

Funciona perfectamente bien. Es sólo el rechazo de grupos de resultados, tales como:

[{"name" : "dean", "age" : 23},{"name" : "bob", "age" : 25}] 

El método se define en la interfaz WCF de la siguiente manera:

[OperationContract] 
[WebInvoke(Method = "POST", 
      BodyStyle = WebMessageBodyStyle.Wrapped, 
      ResponseFormat = WebMessageFormat.Json, 
      RequestFormat = WebMessageFormat.Json)] 

string uploadData(string data); 

Parece que es más de un problema con el servicio WCF que la propia cadena JSON. ¿Alguien sabe por qué WCF aceptaría una cadena JSON simple pero rechazaría un conjunto? Este es un problema importante que ha detenido por completo el desarrollo del proyecto por lo que cualquier ayuda es muy apreciada.

SOLUCIONADO: En lugar de pasar directamente la cadena JSON codificada, en su lugar, envié como valor de otra cadena JSON con la clave "datos".Así que, como el anterior tengo mis resultados de SQLite como:

var json = JSON.stringify(resultSet); 

luego lo paso al servicio de WCF de la siguiente manera:

... 
data: JSON.stringify({ data : json }), 
... 

Y ahora funciona bien.

Respuesta

-1

El paso JSON.stringify es innecesario porque el motor AJAX de jQuery lo hace automáticamente. Sólo tiene que pasar en la matriz de conjunto de resultados como la propiedad data en las opciones de solicitud:

... 
data: resultSet, 
... 

Lo que está haciendo ahora stringifying una matriz para JSON, a continuación, pedir a jQuery-restringify la que resulta cadena como JSON antes de enviarlo al servidor.

+0

Gracias Matt, eso explica algunas cosas. Estoy en casa ahora, pero lo intentaré mañana por la mañana. – dekin88

+0

Te intenté con la solución pero sigues recibiendo el error 400. OP actualizada con detalles – dekin88

Cuestiones relacionadas