2017-01-12 23 views
6

Tôi đang cố gắng gửi yêu cầu ajax từ tệp javascript đến bộ điều khiển cakephp. Ajax đang gửi một đối tượng json đơn giản (tôi đã mã hóa nó trong ví dụ này để đơn giản).CakePHP 3: Phản hồi Ajax trả lại mã phản hồi 200 và một trình phân tích cú pháp

Khi tôi đăng nhập, máy chủ có thể giải mã chuỗi json thành đối tượng. Chức năng $this->Votes->delete được gọi thành công. Vấn đề của tôi là tất cả mọi thứ hoạt động như nó cần, ngoại trừ tôi vẫn nhận được một thông báo lỗi anyways.

Dưới đây là mã của tôi và bên dưới là kết quả đầu ra mà tôi nhận được từ đó.

Javascript:

function unvote() { 
    $.ajax({ 
     type: 'POST', 
     url: '../votes/unvote', 
     async: false, 
     contentType: 'application/json', 
     dataType: 'json', 
     data: JSON.stringify({'post_id':1}), 
     success: function(data, textStatus, jqXHR){ 
      console.log(data); 
      console.log(textStatus); 
      console.log(jqXHR); 
     }. 
     error: function(jqXHR, textStatus, errorThrown){ 
      // this block gets triggered with a 200 response 
      console.log(jqXHR); 
      console.log(textStatus); 
      console.log(errorThrown); 
     }, 
    }); 
} 

PHP: Votes khiển

public function unvote(){ 
    $this->autoRender = false; 
    $vote = $this->Votes->newEntity(); 
    if ($this->request->is('ajax')) { 
     $data = $this->request->input('json_decode'); 
     $vote = // get the correct vote from the database and save into this object 
     if ($this->Votes->delete($vote)) { 
      $this->response->body('Success'); 
      $this->response->statusCode(200); 
     } else { 
      $this->response->body('Failure'); 
      $this->response->statusCode(500); 
     } 
    } 
    $this->response->type('json'); 
    return $this->response; 
} 

ajax đáp ứng:

Object{ readyState=4, responseText="", status=200, statusText="Ok", more...} 
parsererror 
SyntaxError:JSON.parse: unexpected end of data at line 1 column 1 of the JSON data 
> return window.JSON.parse(data + ""); 
+0

Bạn đã gửi đúng 'tiêu đề (" Content-Type: application/json ", true);' và tại sao bạn làm 'window.JSON.parse'? Bởi vì bạn đang mong đợi thông qua dữ liệu 'dataType: 'json'' json, do đó, nó sẽ được phân tích cú pháp là jquery, bạn không phải phân tích nó một mình. – JustOnUnderMillions

+0

Tôi cho rằng phản hồi của bạn không hợp lệ, hãy kiểm tra nhật ký yêu cầu qua F12 trong Trình duyệt (Developer Console -> tab mạng) – JustOnUnderMillions

+1

'status = 200' phải thực hiện với cuộc gọi http, không phải chính dữ liệu đã cho. Trạng thái 200 có nghĩa là ở đây: Nội dung nào đó đã được gửi chính xác. Chỉ có bấy nhiêu thôi. Điều đó không nói gì về nội dung được gửi đi. – JustOnUnderMillions

Trả lời

2

jQuery chức năng ajax đang mong đợi một đối tượng JSON và bạn không cho nó json

Dưới đây là một số gợi ý để làm việc với ajax trong cakephp

  • tôi sẽ không đặt autorender false. Thay vào đó tạo bố cục ajax.
  • Bạn cần phải đặt biến xem _serialize nếu bạn muốn trả lại dữ liệu

tôi sẽ đề nghị làm một cái gì đó như thế này.

$responseData = ['success' => true]; 
$this->set('responseData', $responseData); 
$this->set('_serialize', ['responseData']); 

tài liệu tham khảo bắt buộc từ các tài liệu

JSON and XML Data Views

Có hai cách bạn có thể tạo điểm dữ liệu. Đầu tiên là bằng cách sử dụng phím _serialize, và thứ hai là bằng cách tạo template file bình thường

Using Data Views

Mấu chốt _serialize là một biến quan điểm đặc biệt mà chỉ có biến quan điểm khác (s) nên được tuần tự hóa khi sử dụng chế độ xem dữ liệu.

Các vấn đề liên quan