在 ZEND 中处理 JSONP 调用

Posted

技术标签:

【中文标题】在 ZEND 中处理 JSONP 调用【英文标题】:handle JSONP calls in ZEND 【发布时间】:2011-07-19 21:19:39 【问题描述】:

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

只找到这个页面:

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

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

谢谢

【问题讨论】:

【参考方案1】:

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

Zend_Json_Server 目前用于 JSON-RPC。您找到的链接是添加 JSONP 支持的存档(未实现)提案。

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

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

多田,你已经 JSONP 了。

请仔细阅读我链接的有关清理回调的文档。未能清理回调可能会导致可利用的条件。

【讨论】:

嗨,查尔斯。感谢您的快速回复。我知道我不必使用任何框架,但如果我已经是... :) 将阅读有关消毒的文档并尝试使用 zend 框架来实现它。如果有效,将发布。谢谢 终于有时间检查这个了——它真的很好用。谢谢。【参考方案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 > SCRIPTS > 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+")");
    
);

也许这对某人有帮助...

【讨论】:

以上是关于在 ZEND 中处理 JSONP 调用的主要内容,如果未能解决你的问题,请参考以下文章

接口测试返回数据为JSONP格式时如何处理

支持 JSONP 的 ASP.NET 通用 HTTP 处理程序 (.ashx)

在 Angular JS 1.6 中处理 JSONP 响应

在 Windows 应用程序中处理 JSONP 响应

angularjs中jsonp请求的异常处理

在跨域请求中捕获 JSONP 错误