2014-02-18 20 views
0

我有這個在我的路線文件:CakePHP的(2.4)航線JSON

CakePlugin::routes(); 
Router::mapResources('api'); 
Router::parseExtensions('json'); 

目前,如果我把控制器我有以.json API進行擴展,只要它是一個HTTP GET(未發表)它輸出的json很好,不管方法/函數名稱如何,只要它存在於我的Api控制器中。

如果我發表了一篇文章,雖然我可以解碼發佈的JSON無論函數/我調用的方法,它錯誤說我錯過了xxx.ctp在應用程序/ Api/Views/json/ xxx.ctp =我調用過的任何函數的名稱。

2問題/問題。

理想情況下,我想要解析任何對Api控制器的請求作爲json,但不必在url中指定.json擴展名。

其次,如何/爲什麼不能像HTTP GET那樣輸出json,我需要映射別的東西嗎?

非常感謝

+0

您的期望是有缺陷的。輸出應始終對應於文件類型/擴展名。因此,您總是需要JSON擴展來獲取JSON響應。如果你使用xml,你會得到XML,如果你沒有使用擴展名,你會得到HTTP。這就是它應該如何工作的。不是你所期望的。參見[AJAX和CakePHP](http://www.dereuromark.de/2014/01/09/ajax-and-cakephp/)。如果您只需要JSON,請確保所有其他錯誤(4xx)正確。 – mark

回答

3

如果你想呈現從特定的控制器一切(你的情況,ApiController.php)作爲JSON,而無需用戶追加對他們的要求以.json擴展,可以使用renderAs和您的beforeFilter中的setContent。

public function beforeFilter() { 
     parent::beforeFilter(); 
     $this->RequestHandler->setContent('json'); 
     $this->RequestHandler->renderAs($this, 'json'); 
    } 

renderAs和setContent是RequestHandler的一部分。

這確實意味着這個控制器永遠不會返回除json以外的任何東西。如果你滿意了,你甚至可以刪除擴展捕手在routes.php文件文件...

Router::parseExtensions('json'); 

記住,如果你從你的routes.php文件的文件,你的任何ApiController要求移除上述行kind會導致404被拋出(而不是JSON)。

使用beforeFilter進一步開發,實際上可以根據請求的類型呈現爲不同的內容類型。例如..

public function beforeFilter() { 
     parent::beforeFilter(); 
      if ($this->RequestHandler->isGet()) { 
       $this->RequestHandler->setContent('json'); 
       $this->RequestHandler->renderAs($this, 'json'); 
      } 
    } 
+0

你沒有解決第二點(雖然tbh我不知道問題是什麼 - 沒有足夠的細節)+1請求處理程序示例。 – AD7six

+1

謝謝。我發佈的代碼適用於GET和POST請求,也解決了第一個問題。另外,我只是擴展了答案,以包含有關如何處理請求類型的不同信息,儘管這不是要求提供的。 – Happy

+0

乾杯,這實際上掩蓋了兩個問題。 – Mark