Получение удаленного файла JSON

0

Я изучаю JavaScript, и теперь я застреваю в проблеме, которую я не понимаю. Эта проблема связана с jQuery.get, CORS, jQuery.getJSON и JSONP.

Скажем, что я пишу html файл с некоторыми скриптами, которые обращаются к URL-адресу с некоторым содержимым JSON. Файл html находится в моей локальной файловой системе и выглядит следующим образом:

<!DOCTYPE html>

<head>
  <title>Test</title>
  <script src = "test.js"
  charset = "UTF-8"></script>
  <script src = "jquery/jquery-1.9.1.js"
  charset = "UTF-8"></script>
</head>

<body>
  <h1>Test</h1>

  <script type="text/javascript">
    queryAuctionFiles('eu', 'tyrande');
  </script>
</body>

Функция queryAuctionFiles, вызываемая в теге body script, выглядит следующим образом:

// File: test.js
function queryAuctionFiles(realm, server)
{
  var url = 'http://' +
        realm +
        '.battle.net/api/wow/auction/data/' +
        server;

  jQuery.get(url, function(data)
  {
    alert( "Eureka!" );
  });
}

Открыв html с помощью браузера Chrome (V 32.0.1700.76 м), возникает следующая ошибка:

XMLHttpRequest не может загрузить http://eu.battle.net/api/wow/auction/data/tyrande. В запрошенном ресурсе нет заголовка "Access-Control-Allow-Origin". Поэтому исходный 'null' не допускается.

В результате поиска я узнал, что эта ошибка объясняется тем, что сбор ресурсов из какого-либо домена (моей локальной файловой системы) другому (eu.battle.net) запрещен по соображениям безопасности.

Я также прочитал, что эти запросы на междоменные запросы могут быть достигнуты с помощью CORS, но если Im не ошибается, этот материал CORS должен быть включен по обе стороны петиции; в моем случае: мой Chrome должен поддерживать CORS, и eu.battle.net должен включить его, как я могу узнать, поддерживает ли какой-либо домен CORS?

Ища решение для моей проблемы, Ive нашел о методе jQuery.getJSON, поэтому Ive дал ему попробовать, но результат был тот же, следующий код:

jQuery.getJSON(url, function(data)
{
  alert( "Eureka!" );
});

Производит ту же ошибку No 'Access-Control-Allow-Origin', во-первых, я думал, что ошибка возникает, потому что данный url не является файлом JSON, но это, без сомнения, перекрестная доменная ошибка. Когда я думал о сдаче, я читал о JSONP и о том, как он управляется jQuery:

Если URL-адрес содержит строку "callback =?" (или аналогично, как определено API-интерфейсом на стороне сервера), вместо этого запрос обрабатывается как JSONP.

Итак, я сделал следующее изменение:

jQuery.getJSON(url + '?callback=?', function(data)
{                  //^~~~~~~~~~~~~
  alert( "Eureka!" );
});

И после этого я получаю другую ошибку:

Uncaught SyntaxError: Неожиданный токен:

И, имя файла, где отмечен синтаксический знак, является tyrande в строке 1, содержимое этого файла тирана выглядит следующим образом:

{"files":[{"url":"http://eu.battle.net/auction-data/d5357dc91898b3f78edfd1fbbe8867e8/auctions.json","lastModified":1390475765000}]}

Это содержимое - это вход, который я ожидал в анонимной функции, переданной как второй параметр getJSON!

Похоже, что getJSON загрузил файл с именем tyrande, из предоставленного url, а затем eval() его содержимое, это содержимое является входом JSON и, следовательно, не является допустимой строкой JavaScript для оценки.

Теперь, когда я подробно объяснил, что я пробовал, и, зная мою цель, прошу:

  • Для получения удаленных ресурсов важно, является ли html файл в моей файловой системе или удаленном сервере?
  • Является ли CORS что-то, что должно быть включено? как мне включить его в мои скрипты? как я должен проверить, поддерживает ли удаленный ресурс CORS?
  • Если Im, использующий jQuery.getJSON, имеет значение, если адрес ресурса не является файлом JSON?
  • Что я делаю неправильно в своем последнем изменении? почему файл с именем tyrande загружается, а затем его содержимое является eval() uated?

Спасибо за внимание

  • 0
    Это все возможно, но только если на удаленном сервере реализованы CORS или JSONP. Вы также можете прокси-запросы от сервера, которым вы управляете. Если вы хотите узнать больше об этих концепциях, есть много информации по этим темам на SO или доступны через поисковую систему. Ваша ситуация не уникальна. Он освещен в сотнях других SO-тем, постов в блогах и статьях, посвященных общению из разных источников.
  • 0
    Я знаю, и я уже проверил много SO-потоков, но, к сожалению, ни одно из перечисленных в них решений не помогло мне.
Показать ещё 4 комментария
Теги:
cors
getjson

1 ответ

1
Лучший ответ

Это невозможно. Перекрестная политика домена не позволит вам получать файл из другого домена.

Проверьте это

  • 0
    Ну, и как это функция jQuery.getJSON с "callback=?" дополнение по крайней мере доступ к удаленному содержимому?
  • 0
    @PaperBirdMaster Вы говорите о JSONP, и это позволит общаться между источниками, но только если сервер соответствует.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню