2012-07-12 41 views
7

Tôi đang cố gắng để gửi dữ liệu JSON từ một trang web sử dụng JQuery, như thế này:cakephp 2.2 lấy dữ liệu json trong điều khiển

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

Trong cake2.2, tôi có một bộ điều khiển tên Ajax mà có một phương pháp có tên "đăng nhập", như sau:

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

Tôi chỉ muốn xem liệu tôi có chuyển đúng dữ liệu đến bộ điều khiển hay không. Nếu tôi sử dụng dòng này:

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

tôi có thể thấy debug in:

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

Tôi đọc trong cuốn hướng dẫn 2.x CakePHP, dưới "Truy cập XML hoặc dữ liệu JSON", nó cho thấy cuộc gọi này để giải mã dữ liệu:

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

Khi tôi gỡ lỗi in $ data, tôi nhận được "null". Tôi đang làm gì sai? Dữ liệu của tôi có được truyền từ Javascript không chính xác không? Hay tôi không gọi giải mã chính xác?

Cảm ơn mọi đề xuất.

============= Sửa My own ========

Tìm thấy sai lầm của mình thông qua các thí nghiệm:

Khi đăng thông qua Javascript, thay vì dòng này:

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

Thay đổi nó để:

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

Trong các mã điều khiển, thay đổi dòng này:

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

Để:

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

Nó hoạt động.


Dunhamzzz,

Khi tôi đi theo đề xuất của bạn, kiểm tra việc "$ this-> request-> params" mảng trong mã điều khiển của tôi, nó có chứa những điều sau đây:

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

Như bạn có thể thấy, dữ liệu mà tôi đang tìm kiếm không có ở đó. Tôi đã có mã tuyến thích hợp. Điều này phù hợp với những gì tài liệu cho 2.x nói ở đây:

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

Cho đến nay, cách duy nhất mà tôi tìm thấy để làm cho nó hoạt động, là như đã nêu ở trên trong "Edit riêng của tôi". Nhưng nếu việc gửi một chuỗi JSon đến máy chủ không phải là điều đúng, tôi muốn sửa lỗi này, bởi vì cuối cùng, tôi sẽ phải xử lý mã của bên thứ ba sẽ gửi các đối tượng JSon.

Trả lời

1

Lý do bạn đang đấu tranh wit dữ liệu là bởi vì bạn đang gửi một chuỗi với jQuery, không phải là một đối tượng javascript thích hợp (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); 
    } 
}); 

Bây giờ dữ liệu sẽ có sẵn dưới dạng mảng PHP trong $this->request->params.

Ngoài ra để gửi phản hồi JSON, please see this manual page. Hầu hết mã của bạn có thể được giảm xuống chỉ còn 2 dòng ...

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

//Controller that sends JSON 
$this->set('_serialize', array('data')); 
Các vấn đề liên quan