Не удается загрузить кросс-домен json (p) с помощью Sencha Touch - PullRequest
4 голосов
/ 24 ноября 2011

У меня чертовски много времени пытается загрузить внешний JSON в приложение Sencha Touch. Я могу определить свои данные в приложении или с помощью внешнего файла JSON, и все в порядке. Затем я перемещаю свой файл json на сервер удаления, меняю свой прокси-сервер на тип: 'scripttag', чтобы позаботиться о проблемах jsonp, а затем у меня возникают проблемы. Когда я смотрю на ресурсы моей страницы, я вижу, что файл json загружен, но он не заполняет мой список, как это происходит с моим локальным файлом json.

Использование локального файла json (это работает)

    var jsonStore = new Ext.data.Store({
        model: "Person",
        proxy: {
            type: 'ajax',
            url: 'http://dev.liftstudios.ca/data.json',
            reader: {
                type: 'json'
            }               
        },
        autoLoad: true
    });

    var jsonPanel = {
        title: "json",
        items: [
            {
                xtype: 'list',
                store: jsonStore,
                itemTpl:itemTemplate,
                singleSelect: true
            }
        ]           
    };

Использование того же файла json, загруженного с удаленного хоста.

Это загружает файл, но не заполняет список.

    var jsonStore = new Ext.data.Store({
        model: "Person",
        proxy: {
            type: 'scripttag',
            url: 'http://www.server.com/data.json',
            reader: {
                type: 'json'
            }               
        },
        autoLoad: true
    });

    var jsonPanel = {
        title: "json",
        items: [
            {
                xtype: 'list',
                store: jsonStore,
                itemTpl:itemTemplate,
                singleSelect: true
            }
        ]           
    };

Возможно, здесь что-то смущающе простое, что мне здесь не хватает, но я не уверен, что это такое. Любая помощь будет оценена.

Ответы [ 3 ]

3 голосов
/ 24 ноября 2011

Смена типа прокси на scripttag не имеет никакого смысла.Если вы хотите загрузить хранилище scripttag , вам также необходимо реализовать функцию обратного вызова.Если вы хотите совершать кроссплатформенные вызовы ajax с существующим прокси-сервером json, вы можете протестировать его в браузере, отключив веб-безопасность в chrome.

Проблема междомена может быть решена путем запуска Google Chrome изтерминал по этой команде google-chrome --args --disable-web-security

Для получения дополнительной информации перейдите по этой ссылке

http://www.senchatouchbits.com/7/cross-domain-ajax-requests.html

Надеюсь, это поможет ...

1 голос
/ 28 декабря 2011

Используйте тип jsonp для типа прокси в хранилище.

var jsonStore = new Ext.data.Store({
    model: "Person",
    proxy: {
        type: 'jsonp',
        url: 'http://www.server.com/data.json',
        reader: {
            type: 'json'
        }               
    },
    autoLoad: true
});

И Реализация на стороне сервера:

На стороне удаленного сервера должна быть настроена функция возврата данных в этом формате.Вот несколько советов о том, как этого добиться, используя Java, PHP и ASP.net:

Java:

boolean jsonP = false;
String cb = request.getParameter("callback");
if (cb != null) {
    jsonP = true;
    response.setContentType("text/javascript");
} else {
    response.setContentType("application/x-json");
}
Writer out = response.getWriter();
if (jsonP) {
    out.write(cb + "(");
}
out.print(dataBlock.toJsonString());
if (jsonP) {
    out.write(");");
}

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);
}

ASP.net:

String jsonString = "{success: true}";
String cb = Request.Params.Get("callback");
String responseString = "";
if (!String.IsNullOrEmpty(cb)) {
    responseString = cb + "(" + jsonString + ")";
} else {
    responseString = jsonString;
}
Response.Write(responseString);

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.data.proxy.JsonP

0 голосов
/ 02 июля 2013
var jsonStore = new Ext.data.Store({
    model: "Person",
    proxy: {
        type: 'jsonp',
        url: 'http://www.server.com/data.json',
        reader: {
            type: 'json'
        }               
    },
    autoLoad: true,
   crossDomain: true,
});

crossDomain: true, попробуйте это

...