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.