Pregunta ¿Cómo devolver el tipo de contenido correcto para JSON en CakePHP?


Estoy intentando configurar el encabezado de tipo de contenido para una respuesta JSON a la que se accede con una solicitud AJAX GET. Seguí tutoriales en blogs y panadería, pero siempre recibo 'text / html' de CakePHP. ¿Cómo configuro correctamente el encabezado de tipo de contenido?

Aquí está mi código en este 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; ?>

Cualquier ayuda sería apreciada.

Gracias,

- Isaac


10
2017-08-04 08:37


origen


Respuestas:


Hago llamadas AJAX para recuperar contenido JSON en todos mis proyectos y nunca hice la mayor parte de lo que estás haciendo aquí. La extensión de mi código de controlador se ve más o menos así:

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

  /** Business logic as required */

  echo json_encode ( $whatever_should_be_encoded );
}

Hago mis llamadas Ajax a través de jQuery, así que supongo que podría hacer la diferencia, pero me sorprendería. En este caso, su problema parece estar en el controlador, no en la persona que llama. Recomiendo eliminar las líneas 17-23 y reemplazarlas con un simple echo json_encode ( array('response' => $actions[0]) ) declaración.

También estás probando $this->RequestHandler->isGet(). Prueba probar $this->RequestHandler->isAjax() en lugar. No estoy seguro de si las llamadas Ajax son reconocidas tanto por su tipo como por su método.


7
2017-08-04 10:59



Despues de leer esta y esta, Recibí lo siguiente para volver "Tipo de contenido: application / json":

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

Con el método $ .getJSON de JQuery, sigo recibiendo

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

Pero al menos mis datos están analizando.


6
2017-11-30 05:59



También acabo de tener este problema y lo solucioné usando:

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

También asegúrese de que "depuración" en su archivo de configuración esté configurado a menos de 2, de lo contrario, no se establecerá el encabezado.


2
2018-06-30 10:04



yo soy no seguro (y, para ser sincero, nunca he usado CakePHP), pero es posible que desee tratar de especificar un segundo argumento en el método setContent ..

reemplazar esto:

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

con este:

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

ver Este archivo para un ejemplo..


0
2017-08-04 09:57



He estado teniendo el mismo problema que el póster original, y lo que funcionó para mí fue seguir los consejos de Rob Wilkerson, pero también me aseguré de estar usando

jQuery.ajax()

en lugar de

jQuery.get()

o

jQuery.post()

jQuery.ajax () le permite configurar el tipo de datos a 'json', mientras que los otros dos no parecen permitirle establecer el tipo de datos. Cuando establecí el tipo de datos en la solicitud de AJAX a 'json' todo funcionó como debería.


0
2017-11-11 17:37