10
votes

Comment retourner le bon contenu pour JSON dans CakePHP?

J'essaie de définir l'en-tête de type de contenu pour une réponse JSON accessible avec une demande AJAX GET. J'ai suivi des tutoriels sur des blogs et la boulangerie, mais je reçois toujours "Texte / HTML" de CakephP. Comment définir l'en-tête de type de contenu correctement?

Voici mon code pour le moment: P>

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


2 commentaires

Utilisez-vous le routeur :: parseextensions () dans votre fichier routes.php? Si oui, vous devez définir "débogage" sur 0 dans l'application / config / config / core.php pour le faire répondre avec le type de contenu correct.


Non, je n'utilise pas de routeur :: parseextensions () mais j'ai défini debug à 0 dans la demande de toute façon.


5 Réponses :


1
votes

Je suis pas sûr (et pour être honnête, je n'ai jamais utilisé CakePHP), mais vous voudrez peut-être essayer de spécifier un deuxième argument dans la méthode SeContent.

Remplacer Ceci: xxx

avec ceci: xxx

voir Ce fichier pour un exemple ..


2 commentaires

Je viens d'essayer cela (j'ai déjà essayé des arguments secondaires similaires, mais je pensais que je lui donnerais un autre aller) et ça ne marche pas. Je suis toujours renvoyé par Texte / HTML '.


Moi aussi. J'utilise cela et essayez de forcer le type de réponse avec: $ ceci-> DemandeHandler-> réponds ('Json'); Ni travailler pour moi.



7
votes

Je fais des appels Ajax pour récupérer le contenu JSON dans tous mes projets et je n'ai jamais fait la plupart de ce que vous faites ici. L'étendue de mon code de contrôleur ressemble à ceci:

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

  /** Business logic as required */

  echo json_encode ( $whatever_should_be_encoded );
}


4 commentaires

J'ai essayé de le faire avant - je viens de "retourner json_encode '(et j'ai essayé" echo json_encode "aussi). On m'a dit dans le canal de l'IRC que c'était une mauvaise façon de le faire et la «bonne façon» est d'utiliser une vue. Je suis en désaccord, mais je l'ai fait de toute façon à me conformer. Je vais tester Isajax, mais étant donné que mon appel Ajax est une demande d'obtention, ISGET devrait fonctionner aussi. Je fais aussi mes appels Ajax avec jQuery.


Je viens d'essayer votre suggestion (j'ai tout simplifié tout pour echo json_encode et utilisé Isajax au lieu d'Isget) et je suis toujours renvoyé par Texte / HTML '.


Désolé, Isaac. J'ai oublié de revenir à ce sujet. Le type de contenu ne doit pas avoir d'importance tant que le contenu lui-même est valide JSON. J'évite des vues pour des choses comme celle-ci parce que c'est un fichier supplémentaire faisant essentiellement rien. J'ai des problèmes avec l'encombrement. :-)


Pour moi, le configure :: écrire ('débogueur', 0); était la sauce magique. N.b. Selon @ Réponse de Ajtacka , Configurer :: Ecrire ("débogage ', 1); travaux trop



2
votes

J'ai aussi eu ce problème et j'ai résolu-le à l'aide de: xxx

Assurez-vous également que "Débogage" dans votre fichier de configuration est défini sur moins de 2 sinon l'en-tête ne pas être défini.


1 commentaires

Vous commentez le débogage <2 est brillant. Cependant, aussi loin que je connais $ ceci-> requierhandler-> réponds ('json'); devrait être correct - qui correspond à la définition d'un en-tête de application / json qui est Header le plus approprié pour JSON



1
votes

J'ai eu le même problème que l'affiche originale et ce qui a fonctionné pour moi était de suivre les conseils de Rob Wilkerson, mais assurez-vous également d'utiliser

jQuery.post()


1 commentaires

Vous pouvez réellement spécifier un type de données dans .post () et .get () , voir les docs (à compter de décembre 2011). API.JQUERY.com/JQUERY.POST API.JQUERY.com/JQUERY.GET



7
votes

Après avoir lu Ceci et Ce , j'ai eu le suivant pour revenir" Type de contenu: Application / JSON STRY> ":

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


1 commentaires

J'ai récemment utilisé cette méthode dans Cake 2.0 (bien que déplacé ce code sur une fonction dans AppController afin que tout contrôleur puisse l'utiliser sans répétition). Il semble bien fonctionner et permet à JQuery (1.7) de détecter automatiquement le contenu en tant que JSON.