JSON: Как сделать междоменный вызов JSON

Я пытаюсь запустить следующий код jquery в локальной сети.

 $.ajax({
     type: "GET",
     url: "http://SomeSite/MyUrl/",
     cache: false,
     data: { ... },
     dataType: "json",

     error: function (xhr, status, error) {
                                    ... 
     },
     success: function (json) {
                                    ...
     });

Все работает нормально, пока "SomeSite" не будет localhost. Я имею в виду тот же сервер, с которого была загружена страница.

Но когда "SomeSite" является другим (не локальным) сетевым сайтом, похоже, что запрос зависает. Вызываются не "ошибки", а "функции обратного вызова". Как я могу заставить этот код работать?

Заранее благодарю!

Ответ 1

У меня была такая же проблема. Попытка получить json с сервера, к которому я не имел доступа (= > нет JSONP).

Я нашел http://benalman.com/projects/php-simple-proxy/ Добавьте php-прокси на ваш сервер и выполните вызов ajax в этот файл.
" Любые параметры GET, которые должны быть переданы удалённому ресурсу URL, должны быть указаны в этом параметре".

$.ajax({
   type: 'GET',
   url:'proxy.php?url=http://anyDomain.com?someid=thispage',
   dataType: "json",
   success: function(data){
      // success_fn(data);
   },
   error: function(jqXHR, textStatus, errorThrown) {
      // error_fn(jqXHR, textStatus, errorThrown);
   }
});

где proxy.php(файл от Ben Alman) размещен в вашем домене



Альтернатива (которая, как мне показалось, лучше всего подходит для этого):
http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/

Ответ 2

Есть ли у вас серверный доступ к "SomeSite", или это сторонний участник?

  • Если у вас есть доступ, вы можете включить CORS wp, home на нем. В своей простейшей форме (данные не чувствительны к сеансу) просто добавьте заголовок: Access-Control-Allow-Origin: *

  • Если у вас нет доступа, вы знаете, поддерживает ли он JSONP wp, так? Обычно это связано с передачей по крайней мере параметра callback в URL. (Конечно, если у вас есть доступ, вы можете добавить поддержку JSONP.)

  • Если у вас нет доступа для внесения изменений в "SomeSite" и он не поддерживает ни CORS, ни JSONP, вы можете использовать YQL wp, home как прокси. Он поддерживает как CORS, так и JSONP и может даже переводить форматы данных, выбирать часть данных и т.д.
    (Обратите внимание, что YQL уважает robots.txt, поэтому, если это сторонний сайт, который ограничивает автоматический доступ, вам все равно не повезло.)

Ответ 3

У меня была похожая проблема. Я попробовал прокси-скрипт, указанный Symba, но по какой-то причине он не мог работать на моей машине. В моем случае я пытался отправить запрос приложению, размещенному на JBoss AS на том же хосте. Каким-то образом версия JBoss, которую я имел, не имела способа изменить заголовки ответа, чтобы я мог включить "Access-Control-Allow-Origin", "*".

Я решил это с помощью подхода Symba, описанного выше, но вместо сценария Бена Алмана я просто настроил обратный прокси-сервер на своем сервере Apache, см. Https://www.simplified.guide/apache/configure-reverse-proxy. По умолчанию у Apache будут проблемы с доменами. Установив заголовок ответа "Access-Control-Allow-Origin", "*", см. Http://enable-cors.org/server_apache.html, проблема исчезнет.

Ответ 5

Пожалуйста, посмотрите запрос jQuery кросс-домена ajax. Если удаленный сервер поддерживает JSONP, я думаю, вы можете использовать обратный вызов.

Ответ 6

На самом деле вы можете только позвонить GET.
Существует не отказоустойчивый способ вызова POST, PUT, DELETE или PATCH с помощью межсайтового скриптинга.
Только жизнеспособным способом является написанный вручную прокси.

Ответ 7

Из-за той же политики происхождения вы не можете этого сделать. Одним из способов является использование плагина Flash AJAX jQuery http://flxhr.flensed.com/, который использует Flash-ролик для обхода политики одного и того же происхождения.

Другие параметры - проксировать запросы через свой собственный домен или использовать JSONP.

Ответ 8

Если у вас есть доступ к серверу, на который вы хотите загрузить ресурсы/данные, вы можете изменить заголовки запросов ответа серверов, включив

"Access-Control-Allow-Origin", "*"

Политика одинакового происхождения, применяемая браузерами, насколько я знаю в разной степени строгости в зависимости от браузера, - это (частично?) на основе значений заголовков ответов.

У меня была такая же проблема при попытке загрузить json из webservice. Все хаки JS, с которыми я столкнулся, это не работает, и мне было интересно, почему мне даже нужно это делать, если я хочу загружать данные с сервера, которым я сам управляю (и доверяю). Затем я узнал, что заголовки ответов сервера играют жизненно важную роль во всем этом вопросе. Когда я добавил вышеупомянутый заголовок к HTTP-ответу моего веб-сервиса, проблема была решена.