CakePHP - 对REST API的POST调用返回null

时间:2012-03-02 16:05:19

标签: json cakephp rest cakephp-1.3

我为CakePHP设置了REST,我遇到了一些问题。当调用GET方法时,比如我的控制器上的视图或索引,或者甚至是GET的自定义方法,我都没有问题得到答案。但是当我尝试像添加一样执行POST操作时,即使我可以看到它已正确到达并执行(保存到数据库),但操作中没有输出。

我已正确设置JSON和XML输出的布局文件以及每种输出类型的路由和视图。

编辑:

beforeFilterAppController的相关代码:

      if ( $this->RequestHandler->isAjax() ) {
        $this->layout = 'ajax';
        $this->autoRender = false;
      } elseif  ($this->RequestHandler->isXml()) {
        $this->layout = 'default'; 
        $this->RequestHandler->respondAs('xml');
        $this->RequestHandler->renderAs($this, 'xml');
      } elseif ($this->RequestHandler->ext == 'json') { 
        $this->layout = 'default';
        $this->RequestHandler->respondAs('json');
        $this->RequestHandler->renderAs($this, 'json');
      } elseif ($this->RequestHandler->accepts('html')) {
        $this->layout = 'frontend'; 
      }

路线中的代码:

Router::mapResources('fonykers');
Router::mapResources('voicenotes');
Router::parseExtensions();

add中的FonykersController方法中的相关代码:

$response = array('ok' => true, 'title' => 'Thank you for registering', 'msg' => 'A confirmation email has been sent to the provided email address, please click on the link in the email to complete the registration process');
if ($this->RequestHandler->isXml()) {
  $this->set(compact('response'));
} else if ($this->RequestHandler->ext == 'json') {
  pr('This prints');
  $this->set(compact('response')); //View not being outputted
  pr('This also prints');
} else {
  echo json_encode($response); 
} 

我在/views/fonykers/json

中的观点
<?php echo json_encode(array('response' => $response)); ?>

我的json的布局文件:

<?php 
header("Pragma: no-cache"); 
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate"); 
header('Content-Type: application/json'); 
header("X-JSON: ".$content_for_layout); 
echo $content_for_layout; 
?>

1 个答案:

答案 0 :(得分:2)

你还有一些事情要发生......

您的beforeFilter检查isAjax,然后使用elseif来测试XML或JSON。如果您的请求是AJAX,它将永远不会进入XML / JSON测试。您的布局可能根本没有设置,只留下$this->autoRender = false;

由于autoRender已禁用,因此在某些时候您必须手动调用渲染。使用$this->set()只是准备在视图中使用的变量 - 它实际上不会输出视图。在您的控制器操作中,实际输出任何内容的唯一行是echo json_encode($response);

使用$this->render()强制Cake在您需要时渲染视图。 The 1.3 Book: Rendering a specific view

中的更多信息

顺便说一下,有时您使用...}elseif(...,有时您使用...}else if(...。这在技术上并不是错误的,但保持一致将使您的代码更容易阅读。