обрабатывать вызовы JSONP в ZEND - PullRequest
2 голосов
/ 21 марта 2011

не удалось найти ответ с помощью поиска (или Google), поэтому я спрошу его сам. Можно ли обрабатывать вызовы JSONP в Zend Framework?

нашел только эту страницу:

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

но я не уверен, что это уже реализовано!?

1010 * ТНХ *

Ответы [ 2 ]

9 голосов
/ 21 марта 2011

JSONP - это просто ответ JSON, включенный в указанную функцию обратного вызова, которая выполняется на клиенте.

Zend_Json_Server является только для JSON-RPC на данный момент. Ссылка, которую вы нашли, представляет собой архивированное (не реализованное) предложение о добавлении поддержки JSONP.

Хорошая новость заключается в том, что вам не нужна какая-либо инфраструктура для поддержки JSONP . Предполагая, что $response - это данные, которые вы хотите вернуть пользователю, а $callback содержит очищенный обратный вызов :

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

Тада, у тебя JSONP'd.

Пожалуйста, внимательно прочитайте документ, на который я ссылался, о дезинфекции обратного вызова. Невозможность дезинфекции обратного вызова может привести к условию эксплуатации.

2 голосов
/ 25 марта 2011

для тех из вас, кто использует ZEND Framework и хочет знать, что я должен был изменить, чтобы это работало ...

пришлось внести изменения в пару файлов:

1) добавил новый макет в разделе ПРОСМОТРЫ> ПЛАНЫ с именем 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) добавил новый вид в разделе ПРОСМОТРЫ> СКРИПТЫ> json.phtml

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

Теперь я могу сделать AJAX-вызов через jquery, как это:

$.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+")");
    }
});

Может быть, это кому-то поможет ...

...