2013-02-08 37 views
18

Tôi đang sử dụng Zend Framework 1.x cho dự án của mình. Tôi muốn tạo một dịch vụ Web trả về chỉ chuỗi JSON cho hàm người gọi. Tôi cố gắng để sử dụng Zend_Controller_Action và áp dụng những cách sau:Cách chỉ trả lại JSON từ 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; 

Nhưng khi tôi sử dụng cURL để có được kết quả, nó trở lại với JSON chuỗi bao quanh bởi một số thẻ HTML. Sau đó, tôi đã cố gắng sử dụng Zend_Rest_Controller với các tùy chọn ở trên. Nó vẫn không thành công.

P.S .: Hầu hết những cách trên là từ câu hỏi đã được hỏi về Stack Overflow.

Trả lời

32

Tôi thích cách này!

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

Tôi đã sử dụng phương pháp này một thời gian. Tôi không hiểu sự cần thiết cho tất cả các mã bổ sung. Các phương pháp trợ giúp xử lý tất cả mọi thứ cho bạn như xa như tôi có thể nói. – David

+0

nơi để đặt mã này? Trong chức năng hành động của bộ điều khiển? –

+0

@HarisMehmood hành động của bộ điều khiển của bạn là đúng nơi để đặt nó vì nó là vai trò của nó để xử lý yêu cầu và chuẩn bị đầu ra. – Tim

7

Mã của bạn cũng sẽ cần phải tắt bố cục để ngăn nội dung được bao bọc với mẫu trang chuẩn. Tuy nhiên, một cách tiếp cận dễ dàng hơn nhiều sẽ chỉ được:

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

các helper JSON sẽ mã hóa biến của bạn như JSON, thiết lập các tiêu đề thích hợp và vô hiệu hóa các bố trí và xem kịch bản cho bạn.

9

Bạn cần tắt bố cục và xem hiển thị.

Explicit disable bố trí và xem renderer:

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

Nếu bạn sử dụng các helper controller action json bạn cần phải thêm một bối cảnh json để hành động. Trong trường hợp này, trình trợ giúp json sẽ vô hiệu hóa bố cục và xem trình kết xuất đồ họa cho bạn.

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

Phương pháp của Venu tốt hơn! – Naelyth

0

Nó dễ dàng hơn nhiều.

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

public function fooAction() 
{ 
    $this->view->foo = 'bar'; 
} 
Các vấn đề liên quan