javascript - Хотите получить доступ к содержимому другого домена с помощью AJAX? - PullRequest
1 голос
/ 19 июля 2009

Я пытаюсь написать приложение javascript, которое загружает данные из API openstreetmap (http://wiki.openstreetmap.org/wiki/OSM_Protocol_Version_0.6),, которое по сути является просто спокойным XML-API. Я пытаюсь использовать jquery для доступа к XMl. Однако я получаю ошибки безопасности. Это блокировка межсайтовых скриптов.

Как я могу получить доступ к этому XML? AFAIK OSM не предлагает JSONP, так что это не работает. В любом случае?>

Ответы [ 3 ]

2 голосов
/ 19 июля 2009

Два способа обойти межсайтовый скриптинг - это настроить прокси на стороне сервера для вызова URL с вашим скриптом, вызывающим прокси на стороне сервера. Другой способ - вызвать данные с помощью тега script, который не имеет ограничений для межсайтовых вызовов.

1 голос
/ 05 марта 2012

API-интерфейс Nominatim от OpenStreetMap теперь поддерживает JSONP, поэтому вы можете получать данные исключительно с помощью кода на стороне клиента, не требуя ничего лишнего на вашем собственном сервере. Вот jsfiddle пример - если вы можете сделать это в jsfiddle, вы можете сделать это где угодно.

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

  • Если вы не можете использовать API, поддерживающий JSONP, вам нужно посмотреть на плагины, такие как jquery-xdomain-ajax , используя такие вещи, как YQL и понять, как они работают. Как правило, эти плагины предназначены для чтения HTML больше, чем для запросов к API.
  • Чтобы получить прямой доступ к API, он должен: а) предложить результаты в JSON и б) иметь встроенную поддержку JSONP, что означает:
    • API должен быть настроен на прослушивание параметра, который сообщает ему имя функции для переноса результата в
    • Вы должны выяснить, как называется этот параметр. В случае OSM он называется json_callback, jQuery по умолчанию callback будет работать только в том случае, если случайно это то, что API запрограммирован на прослушивание
    • В jQuery именно этот параметр-специфичный для API ключ параметра должен идти в конце URL вашего запроса с ? (например, если это json_callback, тогда someurl.com/api?json_callback=?). jQuery выясняет, что это такое, заменяет ? на строку, подобную jQuery1712164863864387412, именует встроенную функцию с той же строкой и ожидает получения некоторого кода, который запускает эту функцию по имени и передает ей JSON.
      • Если запрос работает, но обратный вызов не запускается, и вы видите ошибку, подобную parseerror jQuery17109935275333671539_1300495251986 was not called, это означает, что в jQuery есть функция с именем, готовая и ожидающая, но API не использовал эту строку для переноса JSON, поэтому функция не вызывается - вероятно, это означает, что вы не используете правильное имя параметра
    • Без jQuery вам нужно передать ключу параметра имя именованной функции, которая получит JSON
  • Поскольку в сущности все, что происходит, это то, что браузер загружается, то контролируемым образом выполняется фрагмент кода javascript, эквивалентный someFunction({"some": "argument"});, обработка ошибок ограничена (но посмотрите, что jQuery предлагает для jQuery, если вы используете полный $.ajax синтаксис вместо урезанного $.getJSON ярлык)
  • В Firebug для меня, по крайней мере, запросы JSONP не отображаются в консоли, как другие AJAX-вызовы, скорее, они находятся внизу панели NET (поскольку под капотом это, по сути, обходные пути). способ загрузки кода, обработанный больше как скажем <script>).

Надеюсь, это кому-нибудь поможет!

1 голос
/ 19 июля 2009

Сообщение в блоге, на которое ссылается Дэн, показывает, как решить эту проблему, но вот фон:

Единственный способ сделать междоменный вызов Javascript с веб-страницы - через JSONP. Если вам не предлагается JSONP, вам придется прибегнуть к использованию скрипта Proxy, так как браузеры целенаправленно предотвращают выполнение таких вызовов скриптами сайта.

Обратите внимание, что если вы пишете расширение Firefox, вы выполняете в привилегированном пространстве и, таким образом, можете совершать такие междоменные вызовы без ограничений.

...