2017-02-20 21 views
1

Я работаю с JavaScript.XMLHttpRequest работает на консоли, но при использовании в теге скрипта как файл js показывает ошибку CORS

Вот мой код

const BASE_URL = "https://example.com/api"; 
export class BankApi { 

    constructor(XMLHttpRequest){ 
     this.xhr = XMLHttpRequest; 
    } 

    getBankList(callback){ 
     this.xhr.open("GET", BASE_URL+"/listbanks", true); 
     this.xhr.setRequestHeader('Content-Type', 'application/json'); 
     this.xhr.send(null); 
     this.xhr.onreadystatechange = function(){ 
      if (this.readyState != 4) return; 

      if (this.status == 200) { 
       var data = JSON.parse(this.responseText); 
       callback(data); 
      } 
     }; 
    } 
} 

Я написал код в ES6, но у меня есть min.js с использованием спектрально-es2015-модули-UMD. я включил этот файл в клиентском проекте

Когда я называю

var bankApi = new BankApi(new XMLHttpRequest()); 
bankApi.getBankList(function(data){ 
    console.log(data); 
}) 

Я получаю ошибку

XMLHttpRequest cannot load https://example.com/api/listbanks. 
Response to preflight request doesn't pass access control check: 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'https://engineeringqna.com' is therefore not allowed access. 

Но когда я сделать то же самое с консоли отладчика хромовой формы домена https://engineeringqna.com нет ошибка.

var xhr = new XMLHttpRequest(); 
xhr.open("GET","https://example.com/api/listbanks",true); 
xhr.setRequestHeader('Content-Type', 'application/json'); 
xhr.onreadystatechange = function(){ 
if (xhr.readyState == 4) 
    { 
     if (xhr.status == 200) { 
      console.log(data); 
     } 
     else { 
     alert("xhr Errors Occured"); 
     } 
    } 
} 
xhr.send(null); 

Ошибка. Я получаю данные в консоли. Может ли кто-нибудь объяснить мне, что здесь происходит?

спасибо.

+1

Браузер не позволит коду из вашего домена доступа к домену из * другого * домена, если другой домен явно не разрешает его. – Pointy

+0

Согласен. Но там сервер имеет конфигурацию для принятия запроса перекрестного домена. Я не могу понять, как работает копирование и вставка кода в консоли отладчика и не работает, когда код включен в проект и вызывается из консоли браузера. Также я попытался ввести угловой js $ http в консоль браузера. Здесь также, когда я сделал запрос $ http.get, я получил результат без проблем. –

+0

Заголовок ошибки * No 'Access-Control-Allow-Origin' присутствует на запрошенном ресурсе. * Означает, что сервер не ** имеет конфигурацию для приема запросов междоменного доступа. – Pointy

ответ

1

Как установить content-type в application/json это вызывает CORS «предполетный» - запрос OPTIONS, который должен быть обработаны сервером

В этом случае сервер явно не обрабатывает запросы OPTIONS, что приводит к нет ответа доступа-разрешения-источника в ответе, убивая запрос

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

Удаляемая линия

this.xhr.setRequestHeader('Content-Type', 'application/json'); 

Браузер не будет отправлять предполетной запрос, поэтому API должен вести себя, как ожидалось

в зависимости от ответа, вы, возможно, хотели overrideMimeType() метода, чтобы переопределить ответ типа пантомимы - однако, так как запрос работ в консоли, вам, вероятно, это не понадобится

+0

Спасибо @jaromanda. Работал как шарм. Также прошу вас обновить свой брифинг о том, как обращаться с запросом OPTIONS на стороне сервера. –

+0

как обрабатывать ВАРИАНТЫ на стороне сервера зависит от серверной среды - для каждой из этих сред есть много ресурсов, которые объясняют, как обрабатывать запросы предварительной проверки CORS - я не собираюсь их изучать ** все ** для вас –