在ZEND中处理JSONP调用

时间:2011-03-21 17:52:14

标签: php jquery ajax zend-framework jsonp

无法通过搜索(或谷歌)找到答案,所以我会自己问一下。 是否可以处理对zend框架的JSONP调用?

只找到了这个页面:

http://framework.zend.com/wiki/display/ZFPROP/Zend_Json_Server+-+Lode+Blomme

但我不确定它是否已经实施!?

THX

2 个答案:

答案 0 :(得分:9)

JSONP只是一个JSON响应,它包含在客户端上执行的指定回调函数中。

目前

Zend_Json_Server仅适用于JSON-RPC的 。您找到的链接是一个存档(未实现)的提议,用于添加JSONP支持。

好消息是您不需要任何类型的框架来支持JSONP 。假设$response是您希望返回给用户的数据,并$callback contains the sanitized callback

echo $callback, '(', json_encode($response), ');';

Tada,你已经JSONP了。

请注意阅读我关于清理回调的链接文件。未能清理回调可能会导致可利用的情况。

答案 1 :(得分:2)

对于那些使用ZEND框架的人,想知道我必须改变什么才能让这个工作......

必须对几个文件进行更改:

1)在VIEWS>下添加了新的布局LAYOUTS称为json.phtml

<?php  
    header('Content-type: application/javascript');  
    echo $this->layout()->content;  
?>

2)控制器

添加了一个名为jsonAction的新动作

public function jsonAction()  
{
    $this->_helper->layout->setLayout('json');  

    $callback = $this->getRequest()->getParam('callback');
    if ($callback != "")
    {
        // strip all non alphanumeric elements from callback
        $callback = preg_replace('/[^a-zA-Z0-9_]/', '', $callback);
    }  
    $this->view->callback = $callback;  

    // ...  
}

3)在VIEWS&gt;下添加了一个新视图脚本&gt; json.phtml

<?php  
if ($this->callback != "")  
{  
    echo $this->callback, '(', json_encode($response), ');';   
}  
else  
{  
    echo json_encode($response);  
}
?>

现在我可以像这样通过jquery进行ajax调用:

$.ajax({
    type: "GET",
    url: 'http://<your_url>/<your_controller>/json',
    data: {},
    dataType: "jsonp",
    success: function(json) {
        console.log("success");
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log("error("+jqXHR+", "+textStatus+", "+errorThrown+")");
    }
});

也许这有助于某人...