Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cakephp 2.2 retrieve json data in controller

I'm trying to send JSON data from a web page using JQuery, like this:

$.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);
    }
});

In cake2.2, I have a controller named Ajax that has a method named "login", like this:

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;
}

I just want to see if I'm passing in the correct data to the controller. If I use this line:

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

I can see the debug printout:

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

I read in the CakePHP manual 2.x, under "Accessing XML or JSON data", it suggests this call to decode the data:

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

When I debug print $data, I get "null". What am I doing wrong? Is my data passed in from the Javascript incorrect? Or am I not calling the decode correctly?

Thanks for any suggestion.

============= My own Edit ========

Found my own mistake through experiments:

When posting through Javascript, instead of this line:

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

Change it to:

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

AND

In the controller code, change this line:

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

To:

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

It works.


Dunhamzzz,

When I followed your suggestions, and examine the "$this->request->params" array in my controller code, it contains the following:

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

As you can see, the data that I'm looking for is not there. I've already got the the proper routes code. This is consistent with what the documentation for 2.x says here:

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

So far, the only way that I found to make it work, is as stated above in "My own Edit". But if sending a JSon string to the server is not the right thing to do, I would like to fix this, because eventually, I will have to handle third party code that will send JSon objects.

like image 637
wiiNinja Avatar asked Jul 12 '12 01:07

wiiNinja


1 Answers

The reason you are struggling wit the data is because you are sending a string with jQuery, not a proper javascript object (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);
    }
});

Now the data will be available as a PHP array in $this->request->params.

Also for sending a JSON response, please see this manual page. Most of your code there can be reduced to just 2 lines...

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

//Controller that sends JSON
$this->set('_serialize', array('data'));
like image 94
Dunhamzzz Avatar answered Sep 30 '22 18:09

Dunhamzzz