2009-08-04 16 views
9

Próbuję ustawić nagłówek typu zawartości dla odpowiedzi JSON uzyskiwanej za pomocą żądania AJAX GET. Śledziłem tutoriale na blogach i w piekarni, ale zawsze otrzymuję "text/html" z CakePHP. Jak poprawnie ustawić nagłówek typu treści?Jak zwrócić prawidłowy typ zawartości dla JSON w CakePHP?

Oto mój kod w tej chwili:

public function admin_controller_actions_ajax() 
{ 
    Configure::write('debug', 0); 
    if ($this->RequestHandler->isGet()) { 
     $this->autoRender = FALSE; 

     $aco_id = $this->params['url']['aco_id']; 
     $aro_id = $this->params['url']['aro_id']; 

     assert('$aco_id != NULL && $aro_id != NULL && 
       is_numeric($aco_id) && is_numeric($aro_id)'); 

     $actions = $this->Resource->getActionsForController($aco_id, $aro_id); 

     assert('is_array($actions) && is_array($actions[0])'); 

     /* I made RequestHandler part of the $components property */ 
     $this->RequestHandler->setContent('json'); 
     $this->RequestHandler->respondAs('json'); /* I've tried 'json', 'JSON', 'application/json' but none of them work */ 

     $this->set('json_content', json_encode(array('response' => $actions[0]))); 
     $this->layout = NULL; 
     $this->render('/json/default'); 
    } 
} 


/* json/default.ctp */ 
<?php echo $json_content; ?> 

Każda pomoc będzie mile widziane.

Dzięki,

- Isaac

+1

Czy używasz Router :: parseExtensions() w pliku routes.php? Jeśli tak, musisz ustawić "debugowanie" na 0 w app/config/core.php, aby odpowiedzieć prawidłowym typem zawartości. – dhofstet

+0

Nie, nie używam Router :: parseExtensions(), ale mimo to ustawiam debugowanie na 0 w żądaniu. –

Odpowiedz

0

Jestem nie pewny (i, szczerze mówiąc, nigdy nie używany CakePHP), ale może warto spróbować podać drugi argument w sposobie setContent ..

zastąpić to:

$this->RequestHandler->setContent('json') 

z tym:

$this->RequestHandler->setContent('json', 'text/x-json'); 

zobaczyć this file na przykład ..

+0

Właśnie próbowałem tego (wcześniej próbowałem podobnych drugorzędnych argumentów, ale myślałem, że dam mu jeszcze raz) i to nie działa. Nadal otrzymuję komunikat "text/html". –

+0

Ja też. Używam tego i próbuję wymusić typ odpowiedzi za pomocą: $ this-> RequestHandler-> responseAs ('json'); Nie pracujcie dla mnie. – zmonteca

6

robię Ajax wzywa do pobierania zawartości JSON we wszystkich moich projektów i nigdy nie zrobić większość tego, co tu robisz. Zakres mojego kodu kontrolera wygląda mniej więcej tak:

public function do_something_ajaxy() { 
    Configure::write ('debug', 0); 
    $this->autoRender = false; 

    /** Business logic as required */ 

    echo json_encode ($whatever_should_be_encoded); 
} 

robię mój Ajax wywołuje poprzez jQuery więc przypuszczam, że mógłby zrobić różnicę, ale to mnie zaskoczyło. W tym przypadku problem pojawia się w programie obsługi, a nie w programie wywołującym. Zalecam usunięcie linii 17-23 i zastąpienie ich prostą instrukcją echo json_encode (array('response' => $actions[0])).

Testujesz również pod kątem $this->RequestHandler->isGet(). Zamiast tego wypróbuj testowanie $this->RequestHandler->isAjax(). Nie jestem pewien, czy wywołania Ajax są rozpoznawane jako ich typ i metoda.

+0

Próbowałem już to zrobić - po prostu miałem "return json_encode" (i próbowałem też "echo json_encode"). W kanale IRC powiedziano mi, że to zły sposób robienia tego, a "właściwą drogą" jest użycie widoku. Nie zgodziłem się, ale zrobiłem to i tak, by się do tego zastosować. Będę testować isAjax, ale biorąc pod uwagę, że moje wywołanie ajax jest żądaniem pobrania, isGet powinien również działać. Wykonuję również wywołania ajax z jQuery. –

+0

Właśnie wypróbowałem twoją sugestię (uprościłem wszystko, aby wywołać echo json_encode i użyłem isAjax zamiast isGet) i nadal otrzymuję zwrot "text/html". –

+1

Przepraszam, Izaak. Zapomniałem o tym powtórzyć. Typ zawartości nie powinien mieć znaczenia, o ile sama treść jest poprawna JSON. Unikałem widoków na takie rzeczy, ponieważ jest to dodatkowy plik, który w zasadzie nic nie robi. Mam problemy z bałaganem. :-) –

1

Ja również właśnie miał ten problem i rozwiązać go za pomocą:

$this->RequestHandler->respondAs('text/x-json'); 

Również upewnić się, że „debug” w pliku konfiguracyjnym jest ustawiony na mniej niż 2 inaczej nagłówek nie zostanie ustawiona .

0

Byłem ten sam problem jak oryginalny plakat i co pracował dla mnie było śledzić porady Rob Wilkerson, ale również upewnić się, używałem

jQuery.ajax() 

zamiast

jQuery.get() 

lub

jQuery.post() 

jQuery.ajax() pozwala ustawić typ danych na „json”, podczas gdy pozostałe dwa nie robić wydaje się pozwalać na ustawienie typu danych w ogóle. Kiedy ustawiłem typ danych w żądaniu AJAX na "json", wszystko działało tak, jak powinno.

+2

Możesz określić typ danych w '.post()' i '.get()', zobacz dokumentację (stan na grudzień 2011). http://api.jquery.com/jQuery.post/ http://api.jquery.com/jQuery.get/ –

6

Po przeczytaniu this i this, mam następujące powrotu "Content-Type: application/json":

Configure::write('debug', 0); 
$this->RequestHandler->respondAs('json'); 
$this->autoRender = false;    
echo json_encode($data); 

Z $ .getJSON metody jQuery, ja wciąż się

Resource interpreted as image but transferred with MIME type text/html. 

Ale przynajmniej moje dane są parsowane.

+0

Niedawno użyłem tej metody w Cake 2.0 (chociaż przeniesiono ten kod do funkcji w AppController, aby każdy kontroler mógł go używać bez powtarzania). Wydaje się, że działa dobrze i umożliwia jQuery (1.7) automatyczne wykrywanie treści jako JSON. –