2014-02-04 1 views
7

Я пытаюсь реализовать простой перехватчик, который позволяет мне отображать сообщение в строках «не могу связаться с сервером» в моем приложении «Угловое». Однако, поскольку API находится на другом хосте, я имею дело с запросами CORS перед полетом OPTIONS.Можно ли перехватить ответ на предполетную опцию HTTP OPTIONS в AngularJS?

Я обнаружил, что если API является недоступным Chrome инструментов Dev показывает 503 на OPTIONS запросу, но $http перехватчика углового ловит в 404 ответ на последующий GET запрос. Я считаю, что это связано с тем, что ответ OPTIONS не содержал требуемые заголовки CORS, поэтому GET на самом деле никогда не выполнялся.

Можно ли перехватить ответ OPTIONS? Если все, что я вижу, это , я не могу отличить «сервер вниз» от «нет такого ресурса».

+2

Нет, невозможно перехватить ответный сигнал перед отправкой с клиентского JavaScript. Браузер полностью контролирует этот запрос. –

+0

Да, я подумал, что это, вероятно, так. Это расстраивает, если я не могу хотя бы увидеть код состояния HTTP. Лишает меня бессильнее обрабатывать условия ошибок полезным способом. –

+2

Я в том же положении ... Не могу найти, как поймать бэкэнд-отказ на стороне клиента. – maxdec

ответ

3

Вы не можете перехватить этот запрос по дизайну - браузер «проверяет» на вас, убедившись, что вам разрешено сделать запрос.

Мы использовали три решения, чтобы обойти это:

  • Если проблема заключается в том, что вы используете среду разработки, как NodeJS, и ваши доменные имена не соответствуют (то есть, если вы обычно не нужно было заниматься этим в Production), вы можете использовать прокси. https://github.com/substack/bouncyBounceJS NodeJS Module - простой в использовании вариант. Тогда ваш домен запроса веб-службы будет соответствовать домену, на котором находится ваша страница, и проверка не будет инициирована. (Вы также можете использовать трюки, подобные этому в Production, хотя его можно легко злоупотреблять!)
  • Также для временного использования вы можете использовать что-то вроде Fiddler или Charles, чтобы манипулировать запросом, подделав нужные заголовки или сообщив обозревателю не для проверки их (--disable-web-security в Chrome).
  • Если у вас есть эта проблема в Production, вам либо необходимо законно ее исправить (настройте обработчик веб-сервиса, чтобы добавить нужные заголовки - их всего два), либо найдите способ сделать запрос таким образом, t запустить проверку. Например, если вы управляете как исходным, так и целевым доменами, вы можете поместить скрипт на цель , которая делает запросы к себе. Запускайте это в IFRAME, невидимо. Затем вы можете использовать такие вещи, как postMessage(), чтобы общаться туда и обратно. Крупные службы, такие как Facebook, используют «мосты XHR», как это по той же причине.
Смежные вопросы