我有一个ajax调用,让json返回但是我得到一个解析错误。它看起来不错,不确定cakephp设置中缺少什么。
{"member":{"Member":{"total_points":"18"}}}
SyntaxError:无效标签
错误在第一个引号
Cakephp 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) ?>);
MembersController.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/并且已经回来了
答案 0 :(得分:0)
JSONP请求,即跨域请求需要正确的JSONP响应,这是一个函数调用,传递给它的JSON数据:
functionName({"key":"value"});
默认情况下,函数名由jQuery自动定义,但可以使用jsonpCallback
option覆盖。此名称作为参数传递给给定的URL,因此AJAX请求将如下所示:
http://mydomian.com/loyalty/members/api/5749.json?callback=FunctionName...
顺便说一句,你可以在你添加的图片中看到生成的函数名称,在错误中显示Error: jQuery... was not called
。
因此,您必须使用请求中传递的函数名称构建正确的响应。这需要使用视图文件,因此您必须抛弃JsonView
提供的自动序列化。
在你的控制器中,不要设置_serialize
视图var,而只设置member
var和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"}}});