CakePHP JSON için doğru içerik türü dönmek nasıl?

5 Cevap php

Ben bir AJAX GET isteği ile erişilen bir JSON yanıt içerik türü başlığı ayarlamak çalışıyorum. Ben bloglar ve ekmek öğreticiler takip ettik ama ben her zaman CakePHP geri 'text / html' alırsınız. Ben içerik türü başlığı nasıl doğru ayarlanmış mı?

İşte şu anda benim kod:

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

Herhangi bir yardım mutluluk duyacağız.

Teşekkürler,

-- Isaac

5 Cevap

Ben Ajax benim projelerin tüm JSON içeriği almak için çağırır ve ben burada ne yaptığınızı çoğu yapmamıştım yapmak. Benim denetleyicisi kod kapsamı şöyle:

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

  /** Business logic as required */

  echo json_encode ( $whatever_should_be_encoded );
}

Benim Ajax yüzden could bir fark yaratmak olduğunu varsayalım jQuery ile görüşme yapmak, ama bu beni şaşırtmaz. Bu durumda, sorun arayan ile, işleyici olmamak görünür değilsin. Ben hatları 17-23 kaldırma ve basit bir echo json_encode ( array('response' => $actions[0]) ) deyimi ile değiştirmenizi tavsiye ederim.

Ayrıca $this->RequestHandler->isGet() için test ediyoruz. Bunun yerine, $this->RequestHandler->isAjax() test sahipsiniz. Ben Ajax aramaları kendi türü ve yöntemi hem tarafından da tanınan olup olmadığından emin değilim.

Okuduktan sonra this ve this, ben geri dönmek için aşağıdaki "Content-Type:application/json" var:

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

JQuery'nın $. GetJSON yöntemi ile, ben hala alıyorum

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

Ama en azından benim veri ayrıştırma.

Ben de sadece bu sorunu vardı, ve kullanarak bunu çözdük:

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

Ayrıca yapılandırma dosyasında "hata ayıklama" aksi başlığı set olmayacak az 2'ye ayarlanmış olduğundan emin olun.

I not Emin (ve, dürüst olmak gerekirse, ben CakePHP'ye hiç kullanmadım), ama sen setContent yönteminde ikinci bir argüman belirtmek için denemek isteyebilirsiniz ..

Bu değiştirin:

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

Bu ile:

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

this file bir örnek için bkz ..

Ben orijinal poster olarak aynı sorunu yaşıyor, ne benim için çalıştı Rob Wilkerson tavsiyesi takip etmek, ama aynı zamanda emin ben kullanıyordum yapmak oldum

jQuery.ajax()

yerine

jQuery.get()

veya

jQuery.post()

Diğer iki size tüm veri türünü ayarlamak için izin görünmüyor oysa jQuery.ajax () Eğer 'json' için dataType ayarlamanızı sağlar. Ben 'json' için AJAX isteği veri türünü ayarlamak zaman her şeyi gerektiği gibi çalıştı.