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, проблема исчезнет.
Ответ 4
Вы можете попробовать jsonp-запрос http://api.jquery.com/jQuery.ajax/ в разделе crossdomain
Ответ 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-ответу моего веб-сервиса, проблема была решена.