如何在不使用.json的情况下回复cakephp中的jsonp

时间:2013-10-31 03:33:40

标签: javascript json cakephp jsonp

在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请求?我的直觉说这是不可能的。

2 个答案:

答案 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*/ }