2013-02-08 6 views
18

Sto utilizzando Zend Framework 1.x per il mio progetto. Voglio creare un servizio Web restituire solo la stringa JSON per la funzione chiamante. Ho provato ad utilizzare Zend_Controller_Action e applicato quei modi:Come restituire solo JSON da Zend

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; 

Ma quando ho usato cURL per ottenere il risultato, è tornato con la stringa JSON circondato da alcuni tag HTML. Poi ho provato ad usare l'utente Zend_Rest_Controller con le opzioni sopra. Non ha ancora avuto successo.

P.S .: La maggior parte di questi modi sopra sono dalla domanda che era stata posta su Stack Overflow.

risposta

32

Mi piace in questo modo!

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

Ho usato questo metodo per un po 'di tempo. Non capisco la necessità di tutto il codice aggiuntivo. Il metodo di supporto gestisce tutto per te per quanto posso dire. – David

+0

dove mettere questo codice? Nella funzione di azione del controller? –

+0

@HarisMehmood l'azione del controllore è il posto giusto per metterlo in quanto è il suo ruolo per gestire la richiesta e preparare l'output. – Tim

7

Il codice dovrebbe disabilitare anche il layout per impedire che il contenuto venga avvolto con il modello di pagina standard. Ma un approccio molto più semplice sarebbe solo:

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

l'assistente JSON codificherà la variabile come JSON, impostare le intestazioni appropriate e disattivare il layout e la vista lo script per voi.

9

È necessario disattivare il layout e visualizzare il rendering.

esplicita disabilitare il layout e la vista di rendering:

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

Se la vostra utilizzando l'helper azione di controllo JSON è necessario aggiungere un contesto JSON per l'azione. In questo caso l'helper di JSON disabiliterà il layout e visualizzerà il renderer per te.

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

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

    return $this->_helper->json->sendJson($jsonData); 
} 
+0

Il metodo di Venu è migliore! – Naelyth

0

È molto più semplice.

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

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