JSONP с Sencha Touch не работает - PullRequest
1 голос
/ 03 мая 2011

Я следовал этому руководству Sencha Touch: http://www.vimeo.com/15672696 Идеальный учебник, работал безупречно.

Но когда я попытался использовать этот код для моего собственного проекта, я не работал Вот что я сделал:

В своем приложении Sencha Touch я написал следующую функцию:

showContacts = function()
{
    Ext.util.JSONP.request({
        url: 'http://www.hotcoffee.be/check-relations/index.php/json/contactpersonen',
        callbackKey: "callback",
        params: {
            unique: Math.random()
        },
        callback: function(data)
        {
            var contacts = data.results;
            nameOfPanel.update(contacts);
        }
    });
}

Сначала я написал свой собственный JSON-файл на PHP (codeigniter):

<?
    $row[] = array(
        "name" => $item->name,
        "first_name" => $item->first_name,
        "avatar"=>$item->avatar
    );

    // PASSING THE ARRAY $row TO A VIEW
    // ON THE VIEW I OUTPUT THE ARRAY

    $this->output->set_content_type('application/json')->set_output(json_encode($row));
?>

(Результат: см. URL функции showContacts)

Это не сработало, поэтому я предположил, что что-то не так с использованием файла PHP в качестве JSON, поэтому я создал файл JSON:

(Результат: http://www.hotcoffee.be/check-relations/json/friends.json)

Теперь кажется, что это тоже не сработало. Я ломаю голову над этим много часов ... Я также получаю следующие сообщения в отладчике Chrome:

Resource interpreted as Script but transferred with MIME type application/json. (contactpersonen:-1)
Uncaught SyntaxError: Unexpected token : (contactpersonen:1)
Resource interpreted as Image but transferred with MIME type text/html. (csi:-1)

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

Кто-нибудь знает, как с этим справиться? Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 11 августа 2011

это пример php-сервера:

$callback = $_REQUEST['callback'];

// Create the output object.
$output = array('a' => 'Apple', 'b' => 'Banana');

//start output
if ($callback) {
    header('Content-Type: text/javascript');
    echo $callback . '(' . json_encode($output) . ');';
} else {
    header('Content-Type: application/x-json');
    echo json_encode($output);
}

пока вы отлаживаете его в chrome или firefox, вы можете обнаружить, что ответ был объединен с Ext.util.JSONP.callback({})

, вот какjsonp «извлекает данные со страницы, находящейся в домене, который НЕ совпадает с исходным доменом работающей страницы», и передает данные на вашу работающую страницу.

2 голосов
/ 03 мая 2011

Я ответил на аналогичный вопрос здесь: Кажется, Сенче не нравится Rails 'json . Это специфично для Rails, но концепция по-прежнему применима.

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

$response = "<script type='text/javascript'>";
$response .= $_GET['callback'] . "(" . json_encode($row) . ")";
$response .= "</script>";
$this->output->set_content_type('application/json')->set_output($response);
...