2013-02-18 27 views
1

在我的CakePHP應用程序中,我返回JSON並退出某些請求。這方面的一個例子是試圖訪問API一個登錄的GET請求:爲CakePHP發送正確的JSON內容類型

header('Content-Type: application/json'); 
echo json_encode(array('message'=>'GET request not allowed!')); 
exit; 

但是我有前綴與內容類型的回聲,以便其爲JSON發送。否則,我的代碼在另一端解釋它不同。

有關如何解決此問題的任何想法?或者至少改進它。

更新:蛋糕版本2.3.0

+3

這是JSON內容的正確標題。將標題添加到您的內容前沒有任何問題。這是應該的。 – Boaz 2013-02-18 21:51:28

+3

實際上,如果你沒有明確地這樣做,PHP會自動發送一個HTML Content-Type。所以這實際上應該是這樣。 – Jon 2013-02-18 21:54:10

+1

如果這讓你感到困擾,只需創建一個類似'send_my_json($ array)'的包裝函數,它會發送正確的'header()',然後在所提供的參數上調用'json_encode()'。 – 2013-02-18 21:58:04

回答

29

您可以充分利用新的2.x的響應對象:

public function youraction() { 
    // no view to render 
    $this->autoRender = false; 
    $this->response->type('json'); 

    $json = json_encode(array('message'=>'GET request not allowed!')); 
    $this->response->body($json); 
} 

http://book.cakephp.org/2.0/en/controllers/request-response.html#cakeresponse

您也可以使用強大的其餘功能和RequestHandlerComponent自動實現此功能:http://book.cakephp.org/2.0/en/views/json-and-xml-views.html

您只需要允許擴展json並將您的操作稱爲/controller/action.json。 然後cake會自動使用JsonView,你可以傳入你的數組。它將被視爲JSON和一個有效的響應。

兩種方法都比你的「退出」解決方案更清潔 - 嘗試單元測試包含die()/ exit()的代碼。這將結束悲慘。所以最好不要在代碼中首先使用它。

+0

然後就這個問題快速提問。我在這裏問了一個問題:http://stackoverflow.com/questions/14945418/enabling-cors-in-cakephp-app其中設置內容類型的標題是在beforeFiler/beforeRender之前打破訪問控制集。你能闡明一下嗎?正如你的解決方案在這裏回答的問題也解決了這個問題。謝謝。 – Cameron 2013-02-18 23:33:23

+0

是的,標題可以被覆蓋。這就是爲什麼當您可以輕鬆使用響應對象以乾淨的方式執行操作時,您絕不會手動輸出標題。 – mark 2013-02-18 23:40:46

+0

謝謝標記,解釋事情。 – Cameron 2013-02-18 23:43:01

相關問題