2012-07-12 13 views
7

Estoy intentando enviar datos JSON desde una página web utilizando jQuery, así:cakephp 2.2 recuperar datos JSON en el controlador

$.ajax({ 
    type: "post",  // Request method: post, get 
    url: "http://localhost/ajax/login", 
    data: '{username: "wiiNinja", password: "isAnub"}', 
    dataType: "json", // Expected response type 
    contentType: "application/json", 
    cache: false, 
    success: function(response, status) { 
     alert ("Success"); 
    }, 
    error: function(response, status) { 
     alert('Error! response=' + response + " status=" + status); 
    } 
}); 

En cake2.2, tengo un controlador llamado Ajax que tiene un método nombrado "login", así:

public function login($id = null) 
{ 
    if ($this->RequestHandler->isAjax()) 
    { 
     $this->layout = 'ajax'; // Or $this->RequestHandler->ajaxLayout, Only use for HTML 
     $this->autoLayout = false; 
     $this->autoRender = false; 

     $response = array('success' => false); 

     $data = $this->request->input(); // MY QUESTION IS WITH THIS LINE 
     debug($data, $showHTML = false, $showFrom = true); 
    } 
    return; 
} 

sólo quiero ver si estoy pasando en los datos correctos al controlador. Si utilizo esta línea:

$data = $this->request->input(); 

puedo ver la impresión de depuración:

{username: "wiiNinja", password: "isCool"} 

leí en el manual de CakePHP 2.x, apartado "Acceso a los datos XML o JSON", sugiere esta llamada para decodificar los datos:

$data = $this->request->input('json_decode'); 

Cuando depuro imprimir $ datos, obtengo "nulo". ¿Qué estoy haciendo mal? ¿Mis datos pasados ​​desde el Javascript son incorrectos? ¿O no estoy llamando a la decodificación correctamente?

Gracias por cualquier sugerencia.

============= Mi propia ========

Editar encontrado mi propio error a través de experimentos:

Al publicar a través de JavaScript, en lugar de esta línea:

data: '{username: "wiiNinja", password: "isAnub"}', 

Cambiar a:

data: '{"username": "wiiNinja", "password": "isAnub"}', 

Y

En el código del controlador, cambie esta línea:

$data = $this->request->input('json_decode'); 

Para:

$data = $this->request->input('json_decode', 'true'); 

Funciona.


Dunhamzzz,

cuando seguí sus sugerencias, y examinar la matriz "$ this-> request-> params" en mi código del controlador, que contiene lo siguiente:

array(
    'plugin' => null, 
    'controller' => 'ajax', 
    'action' => 'login', 
    'named' => array(), 
    'pass' => array(), 
    'isAjax' => true 
) 

Como puede ver, los datos que estoy buscando no están allí. Ya tengo el código de rutas correcto. Esto es consistente con lo que la documentación para 2.x dice aquí:

http://book.cakephp.org/2.0/en/controllers/request-response.html

Hasta ahora, la única manera que he encontrado para hacer que funcione, es como se ha dicho en "Mi propia Editar". Pero si enviar una cadena JSon al servidor no es lo correcto, me gustaría solucionarlo, porque eventualmente tendré que manejar un código de terceros que envíe objetos JSon.

Respuesta

1

La razón por la que estás luchando con los datos es porque estás enviando una cadena con jQuery, no un objeto JavaScript adecuado (JSON).

$.ajax({ 
    type: "post",  // Request method: post, get 
    url: "http://localhost/ajax/login", 
    data: {username: "wiiNinja", password: "isAnub"}, // outer quotes removed 
    dataType: "json", // Expected response type 
    contentType: "application/json", 
    cache: false, 
    success: function(response, status) { 
     alert ("Success"); 
    }, 
    error: function(response, status) { 
     alert('Error! response=' + response + " status=" + status); 
    } 
}); 

Ahora los datos estarán disponibles como una matriz PHP en $this->request->params.

También para enviar una respuesta JSON, please see this manual page. La mayor parte de su código se puede reducir a solo 2 líneas ...

//routes.php 
Router::parseExtensions('json'); 

//Controller that sends JSON 
$this->set('_serialize', array('data')); 
Cuestiones relacionadas