JSON: Как сделать междоменный вызов JSON - PullRequest
11 голосов
/ 05 апреля 2011

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

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

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

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

Но когда SomeSite - это другой (не локальный) сетевой сайт, это выглядит как зависание запроса. Не вызываются ни функции «error», ни «success». Как я могу заставить этот код работать?

Заранее спасибо!

Ответы [ 8 ]

16 голосов
/ 23 июля 2012

У меня была такая же проблема. Попытка получить 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 (файл от Бена Алмана) находится в вашем домене



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

У вас есть доступ к серверу на SomeSite или это третья сторона?

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

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

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

2 голосов
/ 19 июня 2014

У меня была похожая проблема.Я попробовал прокси-скрипт, указанный 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 , проблема исчезнет.

1 голос
/ 17 февраля 2013

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

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

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

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

1 голос
/ 05 апреля 2011

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

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

1 голос
/ 05 апреля 2011

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

1 голос
/ 05 апреля 2011

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

1 голос
/ 05 апреля 2011

Вы можете попробовать запрос jsonp http://api.jquery.com/jQuery.ajax/ см. Кросс-домен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...