0

.json在 CakePHP 中,框架使用带有扩展名的 url或搜索Acceptshttp 标头来检测要返回的数据类型。

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

4

2 回答 2

0

我需要一个 jsonp 来使用 openlayers 的边界框功能,我做了这样的事情:

在控制器功能中:

$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 . '});';
;
?>

正如你所看到的,我做了一些懒惰的编程来在元素中“构建”输出格式。这很容易针对其他形式的数据进行修改。

编辑:

您不需要使用扩展,因为您在控制器中调用了一个函数。

使用 Config/routes.php http://book.cakephp.org/2.0/en/development/routing.html#file-extensions中的选项

Router::parseExtensions('xml', 'json');

控制器中的函数名将是:

json_myfunction(){ ...

URL 将变为:

localhost/json/mycontroller/myfunction?param1=...
于 2013-10-31T12:48:22.173 回答
0

JSONP 请求将包含一个查询字符串 var(通常称为callback),指定 javascript 回调函数名称。所以你可以检查一下:

if ($this->request->query('callback')) { /*do stuff*/ }

于 2013-11-03T15:21:40.677 回答