简单的CakePHP JSON响应

3

我正在尝试将一些JSON传递给CakePHP 2.5中的控制器,并返回它,以确保一切都顺利进行。

然而,我没有收到任何响应内容。只有一个200成功的状态码。从阅读文档来看,如果我传递一些JSON,则responseHandler将返回JSON作为响应。

不确定我漏掉了什么。

传递的数据:

var neworderSer = $(this).sortable("serialize");

这提供了

item[]=4&item[]=3&item[]=6&item[]=5&item[]=7 

appController.php

public $components = array(
    'DebugKit.Toolbar', 
    'Search.Prg', 
    'Session', 
    'Auth',
    'Session',
    'RequestHandler'
);

index.ctp

    $.ajax({
        url: "/btstadmin/pages/reorder",
        type: "post",
        dataType:"json",
        data: neworderSer,
        success: function(feedback) {
            notify('Reordered pages');
        },
        error: function(e) {
            notify('Reordered pages failed', {
                status: 'error'
            });
        }
    });

PagesController.php

public function reorder() {

    $this->request->onlyAllow('ajax');
    $data = $this->request->data;
    $this->autoRender = false;
    $this->set('_serialize', 'data');

}

更新: 我现在已经将以下内容添加到routes.php文件中。
    Router::parseExtensions('json', 'xml');

我已经更新了控制器到

    $data = $this->request->data;

    $this->set("status", "OK");
    $this->set("message", "You are good");
    $this->set("content", $data);
    $this->set("_serialize", array("status", "message", "content"));

所有的事情现在都完美无缺。

所以你正在使用(或想要使用)JSON视图,对吗? - ndm
是的,我想使用JSON视图,从阅读文档来看,CakePHP没有选择所需的适当视图吗? - Keith Power
2个回答

7

需要提供正确的Accept请求头或扩展名

为了让请求处理程序能够选择正确的视图,您需要发送适当的Accept请求头(application/json),或者在您的情况下提供一个扩展名,例如.json。而且为了能够识别扩展名,必须启用扩展名解析。

请参见http://book.cakephp.org/...views.html#enabling-data-views-in-your-application

视图仅序列化视图变量

JSON视图只会自动序列化视图变量,并且从您展示的代码中看起来您似乎从未设置过名为data的视图变量。

请参见http://book.cakephp.org/...views.html#using-data-views-with-the-serialize-key

需要呈现视图

除非有充分的理由,否则不应禁用自动呈现,并在您的情况下最后手动调用Controller:render()。当前您的操作甚至不会尝试呈现任何内容。

CakeRequest::onlyAllow()是用于HTTP方法的

CakeRequest::onlyAllow()(顺便提一下,这个函数在CakePHP 2.5中被弃用)用于指定允许的HTTP方法,例如GETPOSTPUT等。虽然使用任何可用的检测器,例如ajax会起作用,但您可能不应该依赖它。

长话短说

您的reorder()方法应该像这样:

public function reorder() {
    if(!$this->request->is('ajax')) {
        throw new BadRequestException();
    }
    $this->set('data', $this->request->data);
    $this->set('_serialize', 'data');
}

最后,如果您不想/不能使用 Accept 头部信息,您需要将 .json 扩展名添加到 AJAX 请求的 URL 中:

url: "/btstadmin/pages/reorder.json"

因此,您需要在routes.php中启用扩展解析,例如:

Router::parseExtensions('json');

ps

请参考Cakephp REST API去除使用.format的必要性,了解在不使用扩展名的情况下使用JSON视图的方法。


1
谢谢。我有reorder.json,但是我弄坏了应用程序。我漏掉了Router :: parseExtensions('json','xml');现在一切正常。 - Keith Power

0

输出你的 JSON 数据

public function reorder() {

$this->request->onlyAllow('ajax');
$data = $this->request->data;
$this->autoRender = false;
$this->set('_serialize', 'data');
echo json_encode($data);

}

1
是的,我刚刚尝试了一下,现在我可以得到输出了。所以数据是存在的。$this->set('_serialize','data')不是做同样的事情吗? - Keith Power

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接