【问题标题】:CakePHP JSON Response to jQuery ajax callCakePHP JSON 响应 jQuery ajax 调用
【发布时间】:2014-09-12 07:29:47
【问题描述】:

我有以下 jQuery 代码。该代码的目的是将data 设置中的json 数据发送到DocumentsController 控制器中的CakePHP addSourceDocuments() 函数(因此,'url' 设置中的'/documents/addsourcedocuments')。

jQuery.ajax({
    type: 'POST',
    url: '/documents/addsourcedocuments',
    accepts: 'application/json',
    data: {
         sourceFileName: file.name,
         sourceFileId: file.id
    },
    dataType: 'json',
    success: function (data) {
         alert(data);
    },
    error: function (jqXHR, textStatus, errorThrown) {
         alert("error!");
    }
});

CakePHP 文档控制器具有以下代码。我使用 CakePHP Cookbook 2.x “JSON 和 XML 视图”页面 (http://book.cakephp.org/2.0/en/views/json-and-xml-views.html) 中的说明,试图从没有视图的 CakePHP 控制器返回 json 数据。

class DocumentsController extends AppController {
     public $components = array('RequestHandler');
     public function index() {
          $this->layout = 'index';
     }
     public function addSourceDocuments() {
          $this->autoRender = false;
          if ($this->RequestHandler->isAjax()) {
               Configure::write('debug', 0);
          }
          if (!empty($this->data)) {
               $this->log($this->data, 'debug');
               $this->set('response', 'here is the newest content');
               $this->set('_serialize', array('response'));
          }
     }
}

我的 routes.php 文件中也有以下内容(按照上面提到的“JSON 和 XML 视图”页面的说明)。

Router::parseExtensions('json');

虽然 CakePHP 控制器成功接收到来自 jQuery ajax 调用的数据($this->log($this->data, 'debug'); 正在将接收到的数据写入日志,这是我期望接收的数据),但 CakePHP 控制器没有返回任何数据(@ jQuery.ajax 调用的 error 设置中的 987654331@ 值是一个空字符串)。唯一提供的其他信息是errorThrown.message 设置的值为“输入意外结束”,textStatus 设置的值为“parsererror”。

我希望jQuery.ajax 调用的success 设置应在data 变量中包含“这是最新内容”,因为addSourceDocuments() 函数正在使用_serialize 关键字设置该值。显然,这不会发生。

那么,我做错了什么?

谢谢!

【问题讨论】:

    标签: jquery ajax json cakephp


    【解决方案1】:

    您已禁用自动渲染,因此这是预期的结果,没有返回任何内容。

    话虽如此,解决方案应该是显而易见的,要么不禁用自动渲染,要么手动调用Controller::render()

    更新如 cmets 中所述,AJAX 调用的 accepts 选项必须是具有特定数据类型键的对象,类似于

    accepts: {json: 'application/json'}
    

    但是,实际上根本不需要修改此选项,因为它默认为 application/json, text/javascript,它应该由请求处理程序组件正确解释,以便切换到 JSON 视图。

    【讨论】:

    • 我禁用了自动渲染,因为目标是返回 json 数据,而不是视图和/或布局。如果我正确阅读“JSON 和 XML 视图”页面,则应该可以返回没有视图的结果。
    • @WillR。查看文档:After adding Router::parseExtensions('json'); to your routes file, CakePHP will automatically switch view classes when a request is done with the .json extension, or the Accept header is application/json.。您可以在没有视图的情况下输出 JSON,但在这种情况下,您需要使用 echo json_encode(...) 手动回显值。
    • @WillR。确切地说,没有视图是不可能的,但是没有视图模板文件,这是两件不同的事情。如文档中所述,当使用 _serialize 键时,视图不会使用视图模板,而是直接渲染数据,但是根本不调用 JSON 视图渲染例程,您将一无所获,所以不要'不要禁用自动渲染并观察会发生什么。
    • @Holt _serialize键是,不需要手动输出数据,见Using data views with the serialize key
    • @ndm 是的我知道,但是如果你不使用Router::parseExtensions('json');,你就不会使用数据视图,所以你可以手动输出 json,即使这不是推荐的方式。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    相关资源
    最近更新 更多