2017-01-30 2 views
1

При совершении вызова на сервер домена третьей стороны без типа содержимого запроса я получаю ошибку CORS и никакого ответа. Но при совершении вызова с типом контента text/plain (который является истинным типом содержимого ответа), я получаю ответ, но с ошибкой CORS, поэтому я не могу разобрать это на dom. Вопрос в том, почему ответ приходит второй раз, а не в первый раз. Оба по-прежнему являются ошибкой CORS. Как я могу проанализировать ошибку во второй раз, так как я получаю ответ от сервера?Почему CORS дает разные ответы на разные типы контента

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <script> 
     var xhr = new XMLHttpRequest(); 
     xhr.open('GET', 'http://www.w3schools.com/xml/ajax_info.txt', true); 
     xhr.setRequestHeader('content-type', undefined); 
     xhr.onload = function() { 
      console.log('Test'); 
     }; 
     xhr.send(null); 
     var contentXHR = new XMLHttpRequest(); 
     contentXHR.open('GET', 'http://www.w3schools.com/xml/ajax_info.txt', true); 
     contentXHR.setRequestHeader('content-type', 'text/plain'); 
     contentXHR.onload = function() { 
      console.log('Test request header'); 
     }; 
     contentXHR.send(null); 
    </script> 
    </head> 
    <body> 
      Check console and network tab 
    </body> 
</html> 

enter image description here

enter image description here

enter image description here

enter image description here

+0

Я согласен с вашей точкой @ jaromanda-x, что вкладка сети много раз. Я это заметил. В основном это предупреждение, о котором я знаю. Но если вы посмотрите на ответ, то первый запрос XHR не получит ответа от сервера, но второй запрос XHR имеет ответ, но не разобран в браузере. Я хочу знать, могу ли я проанализировать ответ, поступающий во второй раз, и если да, то как. ИЛИ если я не могу разобрать ответ, тогда как я могу разобрать предупреждение консоли о ошибке CORS. Мне нужно сделать одно. Я не хочу запускать браузер в небезопасном режиме, и я не хочу создавать приложение chrome/firefox/edge здесь – Gary

+0

Cool. Это определенно было промахом. Могу ли я не анализировать ответ, то как я могу разобрать консольное предупреждение о ошибке CORS с помощью JS? – Gary

+0

Я тоже не ожидал кода статуса. Но его статус 200 в порядке.Вот где мой асинхронный код идет haywire – Gary

ответ

2

Если вы не укажете Content-type, XHR выполняет оператор CORS preflight request. Обратите внимание, что Ваш запрос OPTIONS, а не GET. Вот почему вы не получаете ответа от вкладки сети.

По CORS specification:

Заголовок называется быть простой заголовок, если имя поля заголовка является ASCII регистронезависимым матч для Accept, Accept-Language или Content-Language или если это ASCII-регистр без учета регистра для Тип содержимого и тип носителя значения поля заголовка (за исключением параметров ) - это ASCII-регистр без учета регистра для application/x-www-form-urlencoded, multipart/form- данные или текст/равнина.

(...)

Это становится немного более сложным, если автор ресурса хочет быть способен обрабатывать запросы кросс-происхождения с использованием методов отличных простых методов. В этом случае автору необходимо ответить на запрос preflight , который использует метод OPTIONS, а затем должен обрабатывать фактический запрос , который использует желаемый метод (DELETE в этом примере) и дает соответствующий ответ.

Так, в целом, если Content-Type отличается application/x-www-form-urlencoded, multipart/form-data или text/plain, XHR вызовет предполетный (отправить глагол в OPTIONS HTTP).

+0

А это был большой промах с моего конца. Могу ли я разобрать/захватить консольную ошибку CORS из кода Javascript в обычном браузере настроек безопасного режима? – Gary

+1

@Gary вы не можете получить доступ/разобрать это сообщение. Вы можете установить обратный вызов 'contentXHR.onerror', но он будет срабатывать при возникновении нормальной ошибки (включая защиту CORS). Вы можете проверить эти вопросы: [Как обнаружить ошибку Cross Origin (CORS) против других типов ошибок для XMLHttpRequest() в Javascript] (https://stackoverflow.com/questions/19325314/how-to-detect-cross- origin-cors-error-vs-other-types-of-errors-for-xmlhttpreq) и [возможно ли уловить ошибки CORS?] (http://stackoverflow.com/questions/4844643/is-it-possible- to-trap-cors-errors), может быть, может вам помочь. – mrlew

+0

Круто спасибо. Я думаю, ссылки полезны. Возможно, это то, что я искал. – Gary

Смежные вопросы