0

我有一个 ajax 调用,它返回了 get 的 json,但我收到了一个解析错误。看起来不错,不确定 cakephp 设置中缺少什么。

{"member":{"Member":{"total_points":"18"}}}

语法错误:标签无效

错误出现在第一个报价单上

蛋糕PHP 2.0

jQuery 1.9.1

jQuery代码:

$('document').ready(function() {
    $.ajax({
        url: 'http://mydomian.com/loyalty/members/api/5749.json',
        dataType: 'jsonp',
        success: function(response) {
            console.log(resonse);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(jqXHR, textStatus, errorThrown);
        }
    });
});

我原本在views/members/json/api.ctp 中没有文件,现在我在文件中有这个代码,我得到了同样的错误。

<?php echo $callback; ?>(<?php echo json_encode($member) ?>);

成员控制器.php

public function api($mem_id = null) {
    $options = array(
        'fields' => array('Member.total_points'),
        'conditions' => array('Member.member_no' => $mem_id),
        'recursive' => -1
    );
    $members = $this->Member->find('first', $options);
    $this->set(array(
        'member' => $members,
        '_serialize' => array('member')
    ));
}

我已将 json 放入http://jsonlint.com/并且恢复正常

在此处输入图像描述

4

1 回答 1

0

JSONP 请求,即跨域请求需要正确的 JSONP 响应,这是一个函数调用,其中传递了 JSON 数据:

functionName({"key":"value"});

默认情况下,函数名由 jQuery 自动定义,但可以使用jsonpCallback选项覆盖。此名称作为参数传递给给定的 URL,因此 AJAX 请求将如下所示:

http://mydomian.com/loyalty/members/api/5749.json?callback=FunctionName...

顺便说一句,您可以在添加的图像中看到生成的函数名称,在错误中显示Error: jQuery... was not called.

因此,您必须使用请求中传递的函数名称来构建正确的响应。这需要使用视图文件,因此您必须放弃JsonView.

在你的控制器中不要设置_serialize视图变量,而只设置member变量和jQuery提交的回调查询值:

$this->set(array(
    'member' => $members,
    'callback' => $this->request->query['callback']
));

然后在您的.ctp视图文件中输出数据,使其采用函数调用的格式,$callback用作函数名称:

<?php echo $callback; ?>(<?php echo json_encode($member) ?>);

然后响应将如下所示:

jQuerySomeRandomNumbersHere({"member":{"Member":{"total_points":"18"}}});

于 2013-09-13T14:02:36.607 回答