it-swarm.com.ru

Заголовок "Access-Control-Allow-Origin" отсутствует в запрошенной ошибке ресурса

Я пытаюсь получить ленту новостного сайта. Думаю, я бы использовал API фидов Google, чтобы конвертировать фид FeedBurner в JSON. Следующий URL вернет 10 сообщений из ленты в формате json. http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http://feeds.feedburner.com/mathrubhumi

Я использовал следующий код, чтобы получить содержимое выше URL

$.ajax({
            type:"GET",
            dataType:"jsonp",
            url:"http://ajax.googleapis.com/ajax/services/feed/load",
            data:{"v":"1.0", "num":"10", "q":"http://feeds.feedburner.com/mathrubhumi"},

            success: function(result){
                //.....
            }
        });

но это не работает, и я получаю следующую ошибку

XMLHttpRequest не может загрузить http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http%3A%2F%2Ffeeds.feedburner.com%2Fmathrubhumi . Заголовок «Access-Control-Allow-Origin» отсутствует в запрашиваемом ресурс. Источник ' http: // localhost ', следовательно, не имеет доступа.

Как это исправить?

79
Aneeez

Я полагаю, что это может быть связано с тем, что Chrome не поддерживает localhost для прохождения Access-Control-Allow-Origin - см. Проблему Chrome

Чтобы Chrome отправлял Access-Control-Allow-Origin в заголовке, просто добавьте псевдоним localhost в файле/etc/hosts к другому домену, например:

127.0.0.1   localhost yourdomain.com

Затем, если вы получите доступ к вашему сценарию, используя yourdomain.com вместо localhost, вызов должен завершиться успешно. 

76
thanix

Если вы используете браузер Google Chrome, вы можете взломать с расширением.

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

Вы можете использовать его для отладки вашего приложения на локальном компьютере (если все работает на производстве).

Уведомление: Если URL-адрес становится неработающим, расширение имеет имя Access-Control-Allow-Origin: *. Я рекомендую вам отключить это расширение, когда вы не работаете над своими вещами, потому что, например, YouTube не работает с этим расширением.

98
dkruchok

Попробуйте это - установите Ajax-вызов, настроив заголовок следующим образом:

var uri = "http://localhost:50869/odata/mydatafeeds"
$.ajax({
    url: uri,
    beforeSend: function (request) {
        request.setRequestHeader("Authorization", "Negotiate");
    },
    async: true,
    success: function (data) {
        alert(JSON.stringify(data));
    },
    error: function (xhr, textStatus, errorMessage) {
        alert(errorMessage);
    }                
});

Затем запустите свой код, открыв Chrome со следующей командной строкой:

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security
9
Mackander Singh

Просто к вашему сведению, я заметил эту информацию из документации jQuery, которая, по моему мнению, относится к этой проблеме:

Из-за ограничений безопасности браузера большинство запросов «Ajax» подчиняются той же политике происхождения ; запрос не может успешно получить данные из другого домена, субдомена, порта или протокола.

Изменение файла hosts, например @thanix, не сработало для меня, но расширение, упомянутое @dkruchok, решило проблему.

1
vancy.pants

Если это вызов весенней службы загрузки. Вы можете справиться с этим, используя код ниже.

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS")
                    .allowedHeaders("*", "Access-Control-Allow-Headers", "Origin", "Content-type", "accept", "x-requested-with", "x-requested-by") //What is this for?
                    .allowCredentials(true);
        }
    };
}
0
Om.