2017-01-12 37 views
6

Próbuję wysłać żądanie ajax z pliku javascript do kontrolera cakephp. Ajax wysyła prosty obiekt JSON (w tym przykładzie zostałem zakodowany na stałe w prostocie).CakePHP 3: Odpowiedź Ajax zwraca kod odpowiedzi 200 i parsererror

Podczas rejestrowania serwer może dekodować ciąg jsonów w obiekcie. Funkcja $this->Votes->delete jest wywoływana pomyślnie. Mój problem polega na tym, że wszystko działa tak, jak powinno, ale i tak nadal otrzymuję komunikat o błędzie.

Poniżej znajduje się mój kod, a poniżej jest wynik, który otrzymuję z niego.

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: Głosy Controller

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 odpowiedzi:

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

Czy wysłałeś poprawny 'header (" Content-Type: application/json ", true);' i dlaczego robisz 'window.JSON.parse'? Ponieważ spodziewasz się za pośrednictwem danych 'dataType: 'json'' json, więc zostanie on sparsowany jako jquery, nie musisz sam go analizować. – JustOnUnderMillions

+0

Coś twoja odpowiedź jest nieważna, sprawdź log żądania przez F12 w przeglądarce (Developer Console -> karta sieciowa) – JustOnUnderMillions

+1

'status = 200' ma do czynienia z wywołaniem http, a nie dane dane. Status 200 oznacza tutaj: Coś zostało wysłane poprawnie. Nic więcej. To nie mówi nic o treści, która została wysłana. – JustOnUnderMillions

Odpowiedz

2

jQuery funkcja ajax spodziewa obiekt JSON i nie dają się json

Oto kilka wskazówek do pracy z Ajax w CakePHP

  • Nie chciałbym ustawić autorender false. Zamiast tego utwórz układ ajaxowy.
  • trzeba ustawić zmienną widok _serialize jeśli chcesz zwrócić dane

Proponuję robić coś takiego.

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

obowiązkowe referencje od docs

JSON and XML Data Views

Nie

są dwa sposoby można wygenerować widoki danych. Pierwszym z nich jest za pomocą klawisza _serialize, a drugi jest stworzenie normalnych pliki szablonów

Using Data Views

Kluczem _serialize to specjalna zmienna widok, który wskazuje, jakie inne zmienne widzenia (ów) powinna być serializowane podczas korzystania z widoku danych.