Я разрабатываю страницу, которая извлекает изображения из Flickr и Panoramio через поддержку jJuery AJAX.
Сторона Flickr работает нормально, но когда я пытаюсь выйти $.get(url, callback)
из Panoramio, я вижу ошибку в консоли Chrome:
XMLHttpRequest не может загрузить http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150 . Нулевой источник не разрешен Access-Control-Allow-Origin.
Если я запрашиваю этот URL из браузера напрямую, он работает нормально. Что происходит, и могу ли я обойти это? Я неправильно составляю свой запрос, или это то, что Panoramio делает, чтобы мешать тому, что я пытаюсь сделать?
Google не обнаружил никаких полезных совпадений в сообщении об ошибке .
РЕДАКТИРОВАТЬ
Вот пример кода, который показывает проблему:
$().ready(function () {
var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150';
$.get(url, function (jsonp) {
var processImages = function (data) {
alert('ok');
};
eval(jsonp);
});
});
Вы можете запустить пример онлайн .
РЕДАКТИРОВАТЬ 2
Спасибо Дарину за помощь в этом. ВЫШЕ КОД НЕПРАВИЛЬНО. Используйте это вместо:
$().ready(function () {
var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&minx=-30&miny=0&maxx=0&maxy=150&callback=?';
$.get(url, function (data) {
// can use 'data' in here...
});
});
источник
iframe
то, что вы динамически генерируетеdocument.write
?file:///C:/
). Нетiframe
участвует.Ответы:
Для справки, насколько я могу судить, у вас было две проблемы:
Вы не передавали свой спецификатор типа "jsonp"
$.get
, поэтому он использовал обычный запрос XMLHttpRequest. Однако ваш браузер поддерживает CORS (Cross-Origin Resource Sharing), чтобы разрешить междоменный XMLHttpRequest, если сервер его подтвердил. Вот гдеAccess-Control-Allow-Origin
пришел заголовок.Я полагаю, вы упомянули, что запускаете его из файла: // URL. Есть два способа для заголовков CORS сигнализировать, что междоменный XHR в порядке. Одним из них является отправка
Access-Control-Allow-Origin: *
(что, если вы заходили на Flickr через$.get
, они, должно быть, делали), в то время как другой должен был отразить содержимоеOrigin
заголовка. Тем не менее,file://
URL выдают ноль,Origin
который не может быть авторизован через echo-back.Первый был решен окольным путем предложением Дарина использовать
$.getJSON
. Это делает немного волшебства, чтобы изменить тип запроса со своего значения по умолчанию "json" на "jsonp", если он видит подстрокуcallback=?
в URL.Это решило второе, больше не пытаясь выполнить запрос CORS с
file://
URL.Чтобы уточнить для других людей, вот простые инструкции по устранению неполадок:
$.get
и настроеныdataType
наjsonp
.$.getJSON
и включеныcallback=?
в URL.http://
. Скрипты, запускаемые через,file://
имеют ограниченную поддержку CORS.источник
callback=?
не работал для меня, ноjsonp=?
сделал. Любое объяснение этому?http://
? Или есть способ просто открыть файл с использованием этого протокола?Возможно, вам нужно добавить HEADER в ваш вызываемый скрипт, вот что я должен был сделать в PHP:
Подробнее о кросс-домене AJAX ou services WEB (на французском).
источник
Для простого HTML-проекта:
Затем просмотрите свой файл.
источник
POST
запросы, которые вы получаете:code 501, message Unsupported method ('POST')
для googles.У меня работает в Google Chrome v5.0.375.127 (я получаю предупреждение):
Также я бы порекомендовал вам использовать
$.getJSON()
метод вместо этого, так как предыдущий не работает на IE8 (по крайней мере, на моей машине):Вы можете попробовать это онлайн здесь .
ОБНОВИТЬ:
Теперь, когда вы показали свой код, я вижу проблему с ним. У вас есть как анонимная функция, так и встроенная функция, но оба они будут вызваны
processImages
. Вот как работает поддержка JSONP в jQuery. Обратите внимание, как я определяю,callback=?
чтобы вы могли использовать анонимную функцию. Вы можете прочитать больше об этом в документации .Еще одно замечание, что вы не должны звонить Eval. Параметр, переданный вашей анонимной функции, будет уже проанализирован в JSON jQuery.
источник
?
то возвращаемый JSON будет заключен в круглые скобки. Вы не определяете параметр для своей функции обратного вызова, и значение, по-this
видимому, не имеет объекта ответа (по крайней мере,.data
значение равноnull
).callback=?
jQuery указывает внутреннему генерированию случайного имени функции, что приводит к вызову анонимной функции, которую вы передаете.getJSON
. Оценил.Пока запрашиваемый сервер поддерживает формат данных JSON, используйте интерфейс JSONP (JSON Padding). Это позволяет вам делать внешние запросы домена без прокси-серверов или причудливых заголовков.
источник
Это та же политика происхождения , вы должны использовать интерфейс JSON-P или прокси, работающий на том же хосте.
источник
Нам это удалось через
http.conf
файл (отредактировал, а затем перезапустил службу HTTP):В
Header set Access-Control-Allow-Origin "*"
, вы можете указать точный URL.источник
Если вы проводите локальное тестирование или вызываете файл из чего-то подобного,
file://
вам нужно отключить безопасность браузера.На MAC:
open -a Google\ Chrome --args --disable-web-security
источник
В моем случае, тот же код работал нормально на Firefox, но не на Google Chrome. JavaScript консоль Google Chrome сказала:
Мне пришлось отбросить часть www URL-адреса Ajax, чтобы он соответствовал исходному URL-адресу, и тогда он работал нормально.
источник
Не все серверы поддерживают JSONP. Это требует, чтобы сервер установил функцию обратного вызова в своих результатах. Я использую это для получения ответов json с сайтов, которые возвращают чистый json, но не поддерживают jsonp:
источник
Я использую сервер Apache, поэтому я использовал модуль mod_proxy. Включить модули:
Затем добавьте:
Наконец, передайте proxy-url в ваш скрипт.
источник
В качестве заключительного замечания в документации Mozilla прямо сказано, что
Как следствие, это не просто плохая практика использовать «*». Просто не работает :)
источник
Для PHP - это работа для меня на Chrome, Safari и Firefox
https://w3c.github.io/webappsec-cors-for-developers/#avoid-returning-access-control-allow-origin-null
используя axios вызов php live сервисов с файлом: //
источник
header('Access-Control-Allow-Origin: '.( trim($_SERVER['HTTP_REFERER'],'/') ?:'null'),true);
разрешающий перекрестное происхождение с удаленного сервера на другой, а также для (локального) нуля для локального файла.Я также получил ту же ошибку в Chrome (я не тестировал другие браузеры). Это было связано с тем, что я перешел на domain.com вместо www.domain.com. Немного странно, но я мог бы решить эту проблему, добавив следующие строки в .htaccess. Он перенаправляет domain.com на www.domain.com, и проблема была решена. Я - ленивый посетитель, поэтому почти никогда не набираю www, но, видимо, в некоторых случаях это требуется.
источник
Убедитесь, что вы используете последнюю версию JQuery. Мы столкнулись с этой ошибкой для JQuery 1.10.2, и ошибка была устранена после использования JQuery 1.11.1
источник
Folks,
Я столкнулся с аналогичной проблемой. Но с помощью Fiddler я смог разобраться в проблеме. Проблема заключается в том, что URL-адрес клиента, настроенный в реализации CORS на стороне веб-API, не должен иметь косую черту в конце. После отправки запроса через Google Chrome и просмотра вкладки TextView в заголовках раздела « » Fiddler в сообщении об ошибке будет указано что-то вроде этого:
* "Указанный источник политики your_client_url: / 'недопустим. Он не может заканчиваться косой чертой."
Это очень странно, потому что он работал без проблем в Internet Explorer, но доставлял мне головную боль при тестировании с использованием Google Chrome.
Я удалил косую черту в коде CORS и перекомпилировал Web API, и теперь API доступен через Chrome и Internet Explorer без каких-либо проблем. Пожалуйста, дайте этому шанс.
Спасибо энди
источник
В решении выложена небольшая проблема CodeGroover выше , , при которой, если вы измените файл, вам придется перезапустить сервер, чтобы фактически использовать обновленный файл (по крайней мере, в моем случае).
В поисках немного, я нашел этот, чтобы использовать:
И тогда он будет служить в
http://localhost:8000
.источник