好的,我在这个网站上找到了解决方案.基本上你用以下方法覆盖afterFilter方法:
public function afterFilter() {
parent::afterFilter();
if (empty($this->request->query['callback']) || $this->response->type() != 'application/json') {
return;
}
// jsonp response
App::uses('Sanitize', 'Utility');
$callbackFuncName = Sanitize::clean($this->request->query['callback']);
$out = $this->response->body();
$out = sprintf("%s(%s)", $callbackFuncName, $out);
$this->response->body($out);
}
Run Code Online (Sandbox Code Playgroud)
我希望它也可以帮助别人.
我还没有找到如何使用 CakePHP 2正确返回 JSONP 的完整示例,因此我将把它写下来。OP 询问正确的方法,但他的答案没有使用 2.4 中现在可用的本机选项。对于 2.4+,这是正确的方法,直接来自他们的文档:
设置您的视图以接受/使用 JSON(文档):
Router::parseExtensions('json');到您的routes.php配置文件。这告诉 Cake 接受.jsonURI 扩展RequestHandler到您将要使用的控制器中的组件列表/controller/action(将使用 中的视图/view/controller/action.ctp),或者/controller/action.json(将使用 中的视图/view/controller/json/action.ctp)如果您不想定义这些视图,即您不需要进行任何进一步的处理,并且响应已准备就绪,您可以告诉 CakePHP 忽略视图并立即使用_serialize. 使用_serialize将告诉 Cake 以正确的格式(XML、JSON 等)格式化您的响应,设置标头并根据需要返回它,而无需执行任何其他操作(文档)。要利用这个魔法:
$this->set('post', $post);$this->set('_serialize', array('posts'));,其中参数是您刚刚在上一行中设置的视图变量就是这样。所有标头和响应都将由 Cake 接管。这只是让 JSONP 开始工作(文档):
$this->set('_jsonp', true);,Cake 将查找回调函数名称参数,并格式化响应以使用该回调函数名称。从字面上看,设置一个参数即可为您完成所有工作。因此,假设您已将 Cake 设置为接受.json请求,那么使用 JSONP 时的典型操作可能如下所示:
public function getTheFirstPost()
$post = $this->Post->find('first');
$this->set(array(
'post' => $post, <-- Set the post in the view
'_serialize' => array('post'), <-- Tell cake to use that post
'_jsonp' => true <-- And wrap it in the callback function
)
);
Run Code Online (Sandbox Code Playgroud)
还有JS:
$.ajax({
url: "/controller/get-the-first-post.json",
context: document.body,
dataType: 'jsonp'
}).done(function (data) {
console.log(data);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1795 次 |
| 最近记录: |