在CakePHP中,框架使用扩展名为.json
的网址检测要返回的数据类型,或者他们搜索Accepts
http标头。
在JSONP中,我无法修改hTTP标头。 https://stackoverflow.com/a/19604865/80353
我想避免使用.json
然后我尝试使用以下代码设置viewClass:
if ($this->request->is('ajax')) {
$this->log('enter here');
$this->viewClass = 'Json';
}
随后,我意识到请求将不起作用,因为标头不包含XMLHTTPRequest。
我的问题是:
1)如何在不借助url中的扩展名的情况下返回jsonp请求的Json数据?
2)cakephp是否有办法检测jsonp请求?我的直觉说这是不可能的。
答案 0 :(得分:0)
我需要一个jsonp来处理openlayers的boundingbox功能,我做了这样的事情:
在Controller功能中:
$this->layout = false;
// get the callback from the request
$callback = $this->request->query['callback'];
$data = // do something usefull...
$this->set('callback', $callback);
$this->set('json', $data);
$this->render('../Elements/jsonp');
元素:
<?php
$tmp = json_encode($json);
/* Generic JSON template */
if(!isset($debug)){
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
//header('Content-Type: application/json');
}
echo $callback . '({ "type": "FeatureCollection",
"features": ' . $tmp . '});';
;
?>
正如你所看到的,我做了一些懒惰的编程,以便在元素中“构建”输出格式。 对于其他形式的数据,这很容易修改。
编辑:
您不需要使用扩展名,因为您在Controller中调用了一个函数。
使用Config / routes.php中的选项 http://book.cakephp.org/2.0/en/development/routing.html#file-extensions
Router::parseExtensions('xml', 'json');
控制器中的函数名称为:
json_myfunction(){ ...
网址将变为:
localhost/json/mycontroller/myfunction?param1=...
答案 1 :(得分:0)
JSONP请求将包含一个querystring var(通常名为callback
),用于指定javascript回调函数名称。所以你可以检查一下:
if ($this->request->query('callback')) { /*do stuff*/ }