web-dev-qa-db-fra.com

Comment renvoyer uniquement JSON depuis Zend

J'utilise Zend Framework 1.x pour mon projet. Je veux créer un service Web renvoyer uniquement une chaîne JSON pour la fonction appelant. J'ai essayé d'utiliser Zend_Controller_Action et appliqué ces méthodes:

1.

$this->getResponse()
     ->setHeader('Content-type', 'text/plain')
     ->setBody(json_encode($arrResult));

2.

$this->_helper->getHelper('contextSwitch')
              ->addActionContext('nctpaymenthandler', 'json')
              ->initContext();

3.

header('Content-type: application/json');

4.

$this->_response->setHeader('Content-type', 'application/json');

5.

echo Zend_Json::encode($arrResult);
exit;

6.

return json_encode($arrResult);

7.

$this->view->_response = $arrResult;

Mais lorsque j'ai utilisé cURL pour obtenir le résultat, il est revenu avec une chaîne JSON entourée de quelques balises HTML. J'ai ensuite essayé d'utiliser Zend_Rest_Controller avec les options ci-dessus. Cela n'a toujours pas réussi.

P.S .: La plupart de ces moyens proviennent de la question qui avait été posée sur Stack Overflow.

23
Gia Duong Duc Minh

J'aime cette façon!

//encode your data into JSON and send the response
$this->_helper->json($myArrayofData);
//nothing else will get executed after the line above
45
Venu

Vous devez désactiver la mise en page et afficher le rendu.

Désactiver explicitement la présentation et le rendu de la vue:

public function getJsonResponseAction()
{
    $this->getHelper('Layout')
         ->disableLayout();

    $this->getHelper('ViewRenderer')
         ->setNoRender();

    $this->getResponse()
         ->setHeader('Content-Type', 'application/json');

    // should the content type should be UTF-8?
    // $this->getResponse()
    //      ->setHeader('Content-Type', 'application/json; charset=UTF-8');

    // ECHO JSON HERE

    return;
}

Si vous utilisez l'aide à l'action du contrôleur json, vous devez ajouter un contexte json à l'action. Dans ce cas, l'aide json désactivera la mise en page et le rendu de la vue pour vous.

public function init()
{
    $this->_helper->contextSwitch()
         ->addActionContext('getJsonResponse', array('json'))
         ->initContext();
}

public function getJsonResponseAction() 
{
    $jsonData = ''; // your json response

    return $this->_helper->json->sendJson($jsonData);
}
12
Gerard Roche

Votre code devrait également désactiver la mise en page afin d'empêcher le contenu d'être encapsulé avec le modèle de page standard. Mais une approche beaucoup plus simple serait simplement:

$this->getHelper('json')->sendJson($arrResult);

l'assistant JSON codera votre variable en JSON, définira les en-têtes appropriés et désactivera le script de présentation et d'affichage pour vous.

9
Tim Fountain

C'est beaucoup plus simple.

public function init()
{
    parent::init();
    $this->_helper->contextSwitch()
        ->addActionContext('foo', 'json')
        ->initContext('json');
}

public function fooAction()
{
    $this->view->foo = 'bar';
}
1
Alex