2009-08-04 7 views
9

Sto tentando di impostare l'intestazione del tipo di contenuto per una risposta JSON a cui si accede con una richiesta GET AJAX. Ho seguito tutorial su blog e pasticceria, ma ricevo sempre "text/html" da CakePHP. Come imposto correttamente l'intestazione del tipo di contenuto?Come restituire il tipo di contenuto corretto per JSON in CakePHP?

Ecco il mio codice in questo momento:

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

Qualsiasi aiuto sarebbe apprezzato.

Grazie,

- Isaac

+1

Usi Router :: parseExtensions() nel tuo file routes.php? Se sì, devi impostare "debug" su 0 in app/config/core.php per farlo rispondere con il tipo di contenuto corretto. – dhofstet

+0

No, non uso Router :: parseExtensions() ma ho impostato il debug su 0 nella richiesta comunque. –

risposta

0

Sono non sicuro (e, ad essere onesti, non ho mai usato CakePHP), ma si consiglia di cercare di specificare un secondo argomento nel metodo setContent ..

sostituire questo:

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

con questo:

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

vedono this file per un esempio ..

+0

Ho appena provato questo (ho provato argomenti secondari simili prima, ma ho pensato di dargli un altro andare) e non funziona. Ricevo ancora 'text/html' restituito. –

+0

Anch'io. Lo uso E provo a forzare il tipo di risposta con: $ this-> RequestHandler-> respondAs ('json'); Nessuno dei due lavora per me. – zmonteca

6

faccio chiamate Ajax per recuperare il contenuto JSON in tutti i miei progetti e non ho mai fatto la maggior parte di quello che stai facendo qui. L'estensione del mio codice di controllo simile a questa:

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

    /** Business logic as required */ 

    echo json_encode ($whatever_should_be_encoded); 
} 

Faccio il mio chiamate Ajax tramite jQuery quindi suppongo che potrebbe fare la differenza, ma mi sorprenderebbe. In questo caso, il problema sembra essere nel gestore, non con il chiamante. Consiglierei di rimuovere le righe 17-23 e di sostituirle con una semplice dichiarazione echo json_encode (array('response' => $actions[0])).

Stai anche testando per $this->RequestHandler->isGet(). Prova invece a provare $this->RequestHandler->isAjax(). Non sono sicuro che le chiamate Ajax siano riconosciute sia dal loro tipo che dal loro metodo.

+0

Ho provato a farlo prima - ho appena restituito "json_encode" (e ho provato anche "echo json_encode"). Mi è stato detto nel canale IRC che quello era un pessimo modo di farlo e che il "modo giusto" è usare una vista. Sono stato in disaccordo, ma l'ho fatto comunque per conformarmi. Testerò isAjax, ma dato che la mia chiamata ajax è una richiesta get, isGet dovrebbe funzionare anche. Faccio anche le mie chiamate ajax con jQuery. –

+0

Ho appena provato il tuo suggerimento (ho semplificato tutto per echo json_encode e usato isAjax invece di isGet) e ricevo ancora 'text/html' restituito. –

+1

Siamo spiacenti, Isaac. Ho dimenticato di tornare su questo. Il tipo di contenuto non dovrebbe avere importanza fintanto che il contenuto stesso è JSON valido. Evito le visualizzazioni per cose del genere perché è un file extra che non fa praticamente nulla. Ho problemi con la confusione. :-) –

1

Ho anche appena avuto questo problema e risolto utilizzando:

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

Assicurarsi inoltre che "debug" nel file di configurazione è impostato su meno di 2 altrimenti non sarà impostato l'intestazione .

0

Ho avuto lo stesso problema come il manifesto originale, e che cosa ha funzionato per me è stato quello di seguire il consiglio di Rob Wilkerson, ma anche fare in modo che stavo usando

jQuery.ajax() 

invece di

jQuery.get() 

o

jQuery.post() 

jQuery.ajax() consente di impostare il tipo di dati a 'json', mentre gli altri due no sembra che ti permetta di impostare il tipo di dati. Quando ho impostato il tipo di dati nella richiesta AJAX su "json", tutto ha funzionato come dovrebbe.

+2

In realtà è possibile specificare un tipo di dati in '.post()' e '.get()', vedere i documenti (a partire da dic 2011). http://api.jquery.com/jQuery.post/ http://api.jquery.com/jQuery.get/ –

6

Dopo aver letto this e this, ho ottenuto il seguente per tornare "Content-Type: application/json":

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

Con il metodo $ GetJSON di JQuery, sto ancora ricevendo

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

Ma almeno i miei dati stanno analizzando.

+0

Ho recentemente utilizzato questo metodo in Cake 2.0 (sebbene abbia spostato questo codice in una funzione in AppController in modo che qualsiasi controller possa usarlo senza ripetizione). Sembra funzionare bene e consente a jQuery (1.7) di rilevare automaticamente il contenuto come JSON. –