2010-05-08 12 views
15

Estoy convirtiendo una aplicación javascript/php/ajax para usar jQuery para asegurar la compatibilidad con navegadores distintos de Firefox.No se puede pasar nulo al servidor utilizando jQuery AJAX. El valor recibido en el servidor es la cadena "nula"

Tengo problemas para pasar valores verdaderos, falsos y nulos usando la función ajax de jQuery. código

Javascript: código

$.ajax 
(
    { 
     url  : <server_url>, 
     dataType: 'json', 
     type : 'POST', 
     success : receiveAjaxMessage, 
     data: 
     { 
     valueTrue : true, 
     valueFalse: false, 
     valueNull : null 
     } 
    } 
); 

PHP: salida

var_dump($_POST); 

Servidor:

array(3) { 
    ["valueTrue"]=> 
    string(4) "true" 
    ["valueFalse"]=> 
    string(5) "false" 
    ["valueNull"]=> 
    string(4) "null" 
} 

El problema es que la hipótesis nula, verdadero y falsos valores se están convirtiendo al instrumentos de cuerda.

El código Javascript AJAX actualmente en uso pasa nulo, verdadero y falso correctamente, pero solo funciona en Firefox.

¿Alguien sabe cómo resolver este problema usando jQuery?


Aquí hay un código de trabajo (no se usa jQuery) para comparar con el código que no funciona dado anteriormente.

Código Javascript:

ajaxPort.send 
(
    <server_url>, 
    { 
     valueTrue : true, 
     valueFalse: false, 
     valueNull : null 
    } 
); 

código PHP:

var_dump(json_decode(file_get_contents('php://input'), true)); 

de salida del servidor:

array(3) { 
    ["valueTrue"]=> 
    bool(true) 
    ["valueFalse"]=> 
    bool(false) 
    ["valueNull"]=> 
    NULL 
} 

Tenga en cuenta que la hipótesis nula, verdaderos y falsos valores se reciben correctamente.

Tenga en cuenta también que, en el segundo método, la matriz $ _POST no se utiliza en el código PHP. Creo que esta es la clave del problema, pero no puedo encontrar una forma de replicar este comportamiento usando jQuery.


Esta sección se agregó después de que se aceptara la siguiente respuesta.

Aquí hay una versión corregida del código original.

código Javascript: Código

$.ajax 
(
    { 
     url  : <server_url>, 
     dataType: 'json', 
     type : 'POST', 
     success : receiveAjaxMessage, 
     data : JSON.stringify 
     (
     { 
      valueTrue : true, 
      valueFalse: false, 
      valueNull : null 
     } 
    ) 
    } 
); 

PHP: salida

var_dump(json_decode(file_get_contents('php://input'), true)); 

Servidor:

array(3) { 
    ["valueTrue"]=> 
    bool(true) 
    ["valueFalse"]=> 
    bool(false) 
    ["valueNull"]=> 
    NULL 
} 
+0

Podría estar equivocado, pero ¿sus datos son válidos? ¿No deberían incluirse todas las claves/valores en ""? Podría no resolver su problema, pero si escribe sus datos y acaba de pasar una cadena vacía para el valor nulo, entonces creo que podría funcionar. Tengo la sensación de que jquery está ajustando sus datos en "", por lo que el valor que está enviando al servidor es en realidad una cadena que contiene el texto nulo, como este: "nulo". – DannyLane

+0

Gracias por responder a Danny, pero estoy seguro de que verdadero, falso y nulo pueden usarse sin comillas en JSON. Vea www.json.org. – Tom

+0

Probablemente tenías razón, pero te malentendí. La codificación de los datos en el lado de Javascript resolvió el problema. – Tom

Respuesta

10

qué se puede esperar? Está enviando estos valores como parámetros POST, que son cadenas de texto simples. Si desea una transferencia segura, use algún tipo de codificación, como JSON. (Que no es lo que hace dataType - eso se refiere a la respuesta del servidor.)

+1

Gracias. La codificación de los datos como JSON solucionó el problema. No entendí el propósito de la opción 'tipo de datos'. – Tom

1

Espero que envíe los parámetros de consulta como valueNull = en lugar de valueNull = null, que es mi experiencia.

Si está haciendo REST con JSON, aún necesita enviar parámetros de consulta para GETS y no debe convertir todos sus GETS en POSTS para solucionar este problema.

9

Puede utilizar indefinido en lugar de nula.

data: { 
    valueTrue : true, 
    valueFalse: false, 
    valueNull : undefined 
} 
+0

¡Solución dulce! – zeckdude

+0

Eso realmente funcionó perfectamente para mí. –

Cuestiones relacionadas