Проблемы с чтением данных JSON с помощью JQuery. - PullRequest
0 голосов
/ 16 августа 2011

У меня проблемы с использованием jquery для получения данных json из веб-службы, которая находится на другом поддомене, чем мой код на стороне клиента.Когда я получаю доступ к точно таким же данным json из локального текстового файла, мой код работает нормально.

Данные json поступают с этого адреса

var jsonFeed = https://crm.bmw.ca/webservices/RetailerLocator.ashx?language=en&callback=?

MIME-тип данных - text / html, однако я также попробовал application / json.

Здесьэто один из методов доступа

$.getJSON(jsonFeed, function (data) {
    $.each(data, function (i, item) {
        alert(item);
    });
});

Я также попробовал этот метод, который вернулся с parsererror.Я также пробовал это с типом данных jsonp

$.ajax(jsonFeed, {
    crossDomain: true,
    dataType: "json",
    success: function (data, text) {
        $.each(data, function (i, item) {
            alert(item);
        });
    },
    error: function (request, status, error) {
        alert(status + ", " + error);
    }
});

Мой код должен быть полностью на стороне клиента, поэтому прокси-сервер сейчас не вариант.

Пример кого-то сочень похожая проблема может быть найдена здесь. jQuery AJAX JSON. Преобразование типа данных

Ответы [ 3 ]

1 голос
/ 16 августа 2011

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

См. http://en.wikipedia.org/wiki/Same_origin_policy для получения дополнительной информации о том, с чем вы столкнулись.

0 голосов
/ 16 августа 2011

Хотя возвращаемые данные JSON, вероятно, должны иметь тип text / json, большая проблема заключается в том, что вызов API не учитывает ваш параметр "обратного вызова".Так как вы вызываете междоменный API, вы должны использовать JSONP, что означает, что ваши данные должны быть возвращены внутри вызова функции.Например, если вы перейдете к https://crm.bmw.ca/webservices/RetailerLocator.ashx?language=en&callback=mycallback, вы должны увидеть что-то вроде этого:

mycallback ( [{"RetailerID": 1110, "Имя": "BMW St. John's "," Address ":" 120 Kenmount Road "... )

Тот факт, что имя функции обратного вызова, указанное в аргументе" обратного вызова ", не отображается как частьиз возвращенных данных, вероятно, означает, что вы используете неправильное имя для этого параметра.Или, может быть, система не настроена для разрешения междоменных запросов.Вам следует связаться с системным администратором и убедиться, что API разрешает междоменные запросы, а также проверить документы для этого API и убедиться, что вы используете правильное имя параметра обратного вызова.

0 голосов
/ 16 августа 2011

Насколько я могу судить по игре с JSFiddle (http://jsfiddle.net/CEDB5/), упомянутый вами вопрос / ответ правильный: если crm.bmw.ca не начнет отправлять правильный MIME-тип, который вы застряли.

...